2010-02-03 234 views
25

希望我能正確解釋這個...按特定值分組多維數組?

我有一個多維數組,並試圖根據一個鍵的值對它們進行分組。

所以,我試圖按級別對它們進行分組,但事實上我不會事先知道這個級別。所以,這不像我可以把它放在一個for循環中,並說$ i < 7,因爲我不會知道7是關卡級別的最大值,坦率地說,我不確定這就是我需要做它,即使我沒有...

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

什麼我希望能產生:

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

回答

9

您可以通過水平第一

使用需要將它們組foreach來循環進入ar射線檢查,如果電平是與以前的項相同,則組將其與陣列

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

打印($ grouparr)的輸出;將顯示像你希望的

格式,您也可以嘗試

print($grouparr[7]); 

將顯示

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

或者

print($grouparr[3]); 

將顯示

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

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

如果您有控制構建初始數組的權限,最好的辦法就是在添加條目時就像在開始時那樣設置。

如果沒有再建一個臨時數組排序:

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

給你留下引用一起你想要的形式和一切。

儘可能在第一個位置構建數組。

5

這裏是我降落在了一個相同的問題的解決方案,包裝成一個功能:

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

要由指定的鍵排序$ myArray的「水平」只是這樣做:

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

或者如果您不希望將其作爲函數使用,則只需一次性使用,這將從$ myArray創建$ myNewArray,該密鑰按級別分組。

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

這是這樣一個有用的答案。我試圖使用這個,但有$ val是一個獨特的價值。建議? – 2014-04-22 04:31:24

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