2010-02-03 231 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