2010-02-03 19 views
25

Mam nadzieję, że mogę wyjaśnić to poprawnie ...Umożliwia grupowanie wielowymiarowej tablicy według określonej wartości?

Mam tablicę wielowymiarową i próbuję grupować je według wartości jednego klucza.

Próbuję pogrupować je według poziomu, ale nie będę znać poziomu wcześniej. Tak więc, to nie jest tak, że mogę umieścić go w pętli for i powiedzieć, gdy $ i < 7, ponieważ nie będę wiedział, że 7 jest maksymalną wartością dla klucza poziomu, i, szczerze mówiąc, nie jestem pewien, że tak to ja musiałby to zrobić nawet jeśli zrobiłem ...

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 
     ) 
) 

Co mam nadzieję produkować:

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 
       ) 
     ) 
) 

Odpowiedz

9

trzeba grupy je poziomie pierwszy

Korzystanie foreach do pętli do ar check ray jeżeli poziom jest taki sam z poprzedniej pozycji, a następnie grupa to z tej tablicy

$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); 

Wyjście print ($ grouparr); pokaże jak formacie nadzieję

Można także spróbować

print($grouparr[7]); 

Wyświetli

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

Or

print($grouparr[3]); 

Wyświetli

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

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

Najlepszym sposobem, jeśli masz kontrolę nad budowaniem początkowej tablicy, po prostu ustawiaj rzeczy tak jak na początku podczas dodawania wpisów.

Jeśli nie to zbudować tymczasową tablicę sortowania:

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

pozostawia Państwu postaci chciałeś i wszystko odwołuje razem.

Najpierw zbuduj taką tablicę, jeśli to w ogóle możliwe.

5

Oto rozwiązanie I wylądował na identycznym problemem, zawinięte w funkcji:

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

uporządkować $ myarray przez klucz o nazwie "poziom" po prostu to zrobić:

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

Lub jeśli nie chcesz tego jako funkcji, tylko do jednorazowego użycia, to utworzy $ myNewArray z $ myArray pogrupowane według klucza 'poziom'

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

to jest taki przydatny odpowiedź. Próbuję tego użyć, ale aby wartość $ val była unikalną wartością. Propozycje? –

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 
Powiązane problemy