2013-02-26 6 views
5

Ho un array:ri organizzare php array associativo

$example = array(); 

$example ['one'] = array('first' => 'blue', 
          'second' => 'red'); 

$example ['two'] = array('third' => 'purple', 
          'fourth' => 'green'); 

$example ['three'] = array('fifth' => 'orange', 
          'sixth' => 'white'); 

Sulla base di alcuni input alla funzione, ho bisogno di cambiare l'ordine dell'esempio matrice prima del ciclo foreach elabora mia uscita:

switch($type) 

case 'a': 
//arrange the example array as one, two three 
break; 

case 'b': 
//arrange the example array as two, one, three 
break; 

case 'c': 
//arrange the example array in some other arbitrary manner 
break; 

foreach($example as $value){ 
     echo $value; 
} 

C'è un modo semplice per farlo senza reingegnerizzare tutto il mio codice? Ho un ciclo foreach abbastanza approfondito che fa l'elaborazione e se ci fosse un modo semplice per riordinare l'array ogni volta che sarebbe davvero utile.

+2

Qual è lo scopo del tuo "ordinamento di array arbitrario?" Stai semplicemente cercando di randomizzare l'ordine? Oppure, vuoi specificamente spostare gli articoli in modo parametrico? – user1477388

+0

Immagino che il punto sia più che ho bisogno di ordinarli come voglio e che non rientra in alcun criterio di ordinamento facilmente disponibile come alfabetico o numerico ... Ho bisogno che sia ordinato esattamente come gli dico di essere ordinato. – absentx

risposta

2

È possibile utilizzare array_multisort per la permutazione . Presumo che tu conosca la permutazione e non abbia bisogno di derivarla dai nomi delle chiavi. Dire, si desidera che l'ordine two, three, one, poi creare una matrice di riferimento così:

$permutation = array(3, 1, 2); 

Significato: prima voce va in posizione 3, seconda voce in posizione 1, terzo elemento alla posizione 2

Poi, dopo la switch, permute:

array_multisort($permutation, $example); 

Ciò ordinerà matrice $permutation e applicare lo stesso ordine di $example.

+0

dato che non sto usando i tasti numerici, l'array di permutazione funzionerà? Questa sembra essere la strada da seguire perché ho assolutamente ragione in quanto conosco la permutazione che voglio per ogni situazione. – absentx

+0

Non ha nulla a che fare con le chiavi e array_multisort conserva le chiavi non numeriche, quindi: sì, funzionerà –

+0

Sì, questo era il modo per farlo, grazie ancora.Ho preso un po 'per avvolgere la mia mente attorno alle permutazioni (non ho dovuto usarle per un po') ma alla fine questo era il metodo più semplice dato che conoscevo l'ordine di ogni caso. – absentx

0

È necessario scrivere una funzione di ordinamento personalizzata per ciascun caso e quindi utilizzare . Il primo caso potrebbe semplicemente usare sort. L'ordinamento arbitrario deve essere la logica che definisci.

2

Qui non troverai una risposta in argento. Probabilmente dovrai scrivere la tua funzione da utilizzare con uksort().

uksort($example, function ($a, $b) use $type { 
    switch($type) { 
     case 'a': 
      if ($a === 'one' || $b === 'three') return 1; 
      if ($a === 'three' || $b === 'one') return -1; 
      if ($a === 'two' && $b === 'three') return 1; 
      return -1; 
      break; 
     // and so on... 
    } 
}); 
0

Vedo più modi per risolvere questo problema, ma non sapendo di più non so cosa sia meglio.

  1. Fai un pre-score (fare un valore numerico per ogni elemento, calcolato nel vostro "abbastanza in profondità foreach loop"), quindi ordinare l'array da esso utilizzando come criteri principali e singole.

  2. Se i criteri di s si basano solo su campi numerici, ASC/DESC utilizzare http://php.net/manual/en/function.array-multisort.php

  3. effettuare funzioni di ordinamento personalizzato per ogni singolo caso (http://www.php.net/manual/en/function.usort.php)