2010-02-03 11 views
25

Eventualmente, posso spiegare questo correttamente ...Raggruppa un array multidimensionale per un valore particolare?

Ho un array multidimensionale e sto cercando di raggrupparli in base al valore di uno dei tasti.

Quindi, sto cercando di raggrupparli per livello, ma in realtà non conoscerò il livello in anticipo. Quindi, non è che posso metterlo in un ciclo for e dire mentre $ i < 7, perché non saprò che 7 è il valore massimo per la chiave di livello, e, francamente, non sono sicuro che sia così come avrebbe bisogno di farlo, anche se ho fatto ...

Array (
    [0] => Array (
      [cust] => XT8900 
      [type] => standard 
      [level] => 1 
     ) 
    [1] => Array (
      [cust] => XT8944 
      [type] => standard 
      [level] => 1 
     ) 
    [2] => Array (
      [cust] => XT8922 
      [type] => premier 
      [level] => 3 
     ) 
    [3] => Array (
      [cust] => XT8816 
      [type] => permier 
      [level] => 3 
     ) 
    [4] => Array (
      [cust] => XT7434 
      [type] => standard 
      [level] => 7 
     ) 
) 

Quello che sto sperando di produrre:

Array (

    [1] => Array (
      [0] => Array (
        [cust] => XT8900 
        [type] => standard 
        ) 
      [1] => Array (
        [cust] => XT8944 
        [type] => standard 
        ) 
     ) 

    [3] => Array (
      [2] => Array (
       [cust] => XT8922 
       [type] => premier 
       ) 

      [3] => Array (
       [cust] => XT8816 
       [type] => permier 
       ) 
     ) 

    [7] => Array (
      [4] => Array (
       [cust] => XT7434 
       [type] => standard 
       ) 
     ) 
) 

risposta

9

è necessario raggrupparli da livello primo

Usa foreach per eseguire il loop in ar controllo ray se il livello è lo stesso con l'elemento precedente poi gruppo con tale matrice

$templevel=0; 

    $newkey=0; 

    $grouparr[$templevel]=""; 

    foreach ($items as $key => $val) { 
    if ($templevel==$val['level']){ 
    $grouparr[$templevel][$newkey]=$val; 
    } else { 
    $grouparr[$val['level']][$newkey]=$val; 
    } 
    $newkey++;  
    } 
print($grouparr); 

L'uscita stampa ($ grouparr); visualizzerà come il formato che si sperava

Potete anche provare a

print($grouparr[7]); 

Visualizzerà

[7] => Array (
     [4] => Array (
      [cust] => XT7434 
      [type] => standard 
      ) 
    ) 

O

print($grouparr[3]); 

visualizzerà

[3] => Array (
     [2] => Array (
      [cust] => XT8922 
      [type] => premier 
      ) 

     [3] => Array (
      [cust] => XT8816 
      [type] => permier 
      ) 
    ) 
34

Il modo migliore, se si ha il controllo sulla creazione dell'array iniziale, è appena impostato all'inizio così come si aggiungono le voci.

Se poi non costruire un array temporaneo per ordinare:

foreach ($input_arr as $key => &$entry) { 
    $level_arr[$entry['level']][$key] = $entry; 
} 

ti lascia con il modulo che si voleva e tutto si fa riferimento insieme.

Costruire la matrice in quel modo, se possibile, se possibile.

5

Ecco la soluzione che ho atterrato su per un problema identico, avvolto come una funzione:

function arraySort($input,$sortkey){ 
    foreach ($input as $key=>$val) $output[$val[$sortkey]][]=$val; 
    return $output; 
} 

Per ordinare $ myarray dalla chiave denominata "livello" solo fare questo:

$myArray = arraySort($myArray,'level'); 

O se non lo volessi come una funzione, solo per un uso singolo, questo creerebbe $ myNewArray da $ myArray raggruppato dalla chiave 'livello'

foreach ($myArray as $key=>$val) $myNewArray[$val['level']][]=$val; 
+0

questa è una risposta così utile. Sto cercando di usarlo ma per avere $ val essere un valore unico. Suggerimenti? –

6
function group_assoc($array, $key) { 
    $return = array(); 
    foreach($array as $v) { 
     $return[$v[$key]][] = $v; 
    } 
    return $return; 
} 

//Group the requests by their account_id 
$account_requests = group_assoc($requests, 'account_id'); 
2
$result = array(); 
    foreach ($yourArrayList as $data) { 
     $id = $data['level']; 
     if (isset($result[$id])) { 
      $result[$id][] = $data; 
     } else { 
      $result[$id] = array($data); 
     } 
    } 
0
function _group_by($array,$key,$keyName) 
    { 
      $return = array(); 

      foreach($array as $val) { 
       $return[$keyName.$val[$key]][] = $val; 
      } 
     return $return; 

    } //end of function 
Problemi correlati