2011-02-04 23 views
12

La mia matrice:php array associativo ordine chiave (non ordinare)

$data = array('two' => 2, 'one' => 1, 'three' => 3); 

Ora, con cui ho iterare l'array, il primo valore che verrà messo a punto sarà probabilmente

$data['two'] // = 2 @ index[0] 

giusto?

E se volessi spostare $ data [1] nella posizione di $ data [0]?

di riformulare:

Come faccio a fare la matrice simile a questa (in modo che 'si' arriva a $ data [0])

$data = array('one' => 1, 'two' => 2, 'three' => 3 

Perché ho bisogno di questo?

Uso il codice di accensione, la tabella-> genera la funzione incorporata accetta un array associato e crea una tabella ma non offre alcun metodo per disporre le colonne. Questo è il motivo per cui vorrei spostare le colonne nell'array sorgente.

+0

Eventuali duplicati di [? Ordinare un array con chiavi basate su un altro Array] (http : //stackoverflow.com/questions/348410/sort-an-array-by-keys-based-on-another-array) – iautomation

+0

@iautomation La domanda non ha menzionato l'utilizzo di un secondo array per controllare l'ordine del primo.Hanno chiesto una soluzione per controllare l'ordine delle chiavi dopo che l'array è stato creato. L'utilizzo di un altro array potrebbe essere una soluzione possibile, ma non dovrebbe essere un fattore limitante nella ricerca di soluzioni per questa domanda. – RedYetiCo

risposta

6

Dai uno sguardo allo daniele centamore's comment sulla funzione PHP array_splice(), dove fornisce un paio di funzioni per lo spostamento degli elementi in un array associativo.

+0

Ha scritto qualcosa basato su di esso, grazie – nizzle

+4

Questo non risponde alla domanda. L'esempio di Daniele non è per gli array associativi – Ben

+1

ksort ($ data); funziona con me –

1

PHP ha 13 functions for sorting arrays, per chiave, per valore, per funzioni definite dall'utente in cui è possibile specificare che "uno" precede "due". C'è anche array_shift, array_unshift, array_push e array_pop per spostare le cose su o fuori dalla parte anteriore o dalla fine dell'array. Puoi costruire un intero nuovo array da quello esistente.

+0

Lo so, queste funzioni sono fantastiche. Tuttavia, nota come dice "Non ordinare" nel titolo. Inoltre, non ho trovato la funzione array_move_index ('one', 0); – nizzle

+6

Riorganizzare un insieme di elementi * è * ordinamento. Solo perché il tuo ordine non è lessicografico o numerico, non significa che l'organizzazione di array in quell'ordine non sia l'ordinamento. Questo è il vero significato della parola. –

+0

Esattamente, dovresti usare usort e scrivere una chiusura semplice. – loostro

-1

credo, si dovrebbe usare asort funzione:

$data = array('two' => 2, 'one' => 1, 'three' => 3); 

$dataOrdered = $data; 
asort($dataOrdered); 

Run this code

+1

Questo non ordina per chiave, lo ordina in base al valore! Vedi qui: http://codepad.org/wUAsV5hr – oriadam

+0

Domanda specificamente richiesta una soluzione non ordinata. – RedYetiCo

10

due possibili soluzioni (senza utilizzare array_splice):

1) Creare un nuovo array con il nuovo ordine del chiavi.

$new_keys = array('one', 'two', 'three'); 
$new_data = array(); 
foreach ($new_keys as $key) { 
    $new_data[$key] = $data[$key]; 
} 
$data = $new_data; 

2) Spostare l'elemento one anticipo, rimuoverlo dal $data e copiare il resto della matrice.

function rearrangeData($data) { 
    $result['one'] = $data['one']; 
    unset($data['one']); 
    return array_merge($result, $data); 
}  
$data = rearrangeData($data); 
1

Vedi ksort e uksort.

Ecco un esempio di lavoro:

<?php 

$data = array('two' => 2, 'one' => 1, 'three' => 3); 
print_r($data); 
ksort($data); 
print_r($data); 
uksort($data,'cmp'); 
print_r($data); 
function cmp($a, $b) 
{ 
    $num=' one two three four five six seven eight nine ten'; 
    $ai = stripos($num,$a); 
    $bi = stripos($num,$b); 
    if ($ai>0 && $bi>0) { 
     return ($ai > $bi) ? 1 : -1; 
    } 
    return strcasecmp($a, $b); 
} 

uscita:

Array 
(
    [two] => 2 
    [one] => 1 
    [three] => 3 
) 
Array 
(
    [one] => 1 
    [three] => 3 
    [two] => 2 
) 
Array 
(
    [one] => 1 
    [two] => 2 
    [three] => 3 
) 

Esegui questo: http://codepad.org/yAK1b1IP

Problemi correlati