如何按特定子阵列值对多维数组进行分组?

n00*_*101 28 php arrays grouping multidimensional-array

我有一个多维数组,我试图根据特定列中的值对它们进行分组.

我正试图将它们分组level,但我事先并不会真正知道这个级别.所以,这并不是说我可以把它放在一个for循环中然后说while $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
          )
)
Run Code Online (Sandbox Code Playgroud)

我希望生产的东西:

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
                 )
          )
)
Run Code Online (Sandbox Code Playgroud)

Mik*_*ike 39

最好的方法是,如果您可以控制构建初始数组,那么在添加条目时,只需在开始时进行设置即可.

如果没有,那么构建一个临时数组来排序:

foreach ($input_arr as $key => &$entry) {
    $level_arr[$entry['level']][$key] = $entry;
}
Run Code Online (Sandbox Code Playgroud)

给你留下你想要的形式和所有引用的东西.

尽管如此,尽可能地构建这样的数组.


Ger*_*sig 10

你需要将它们按级别第一

如果级别与前一项相同,则使用foreach循环到数组检查,然后将其与该数组分组

  $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);
Run Code Online (Sandbox Code Playgroud)

print的输出($ grouparr); 将显示您希望的格式

你也可以尝试

print($grouparr[7]);
Run Code Online (Sandbox Code Playgroud)

会显示

 [7] => Array (
      [4] => Array (
             [cust] => XT7434
             [type] => standard
             )
      )
Run Code Online (Sandbox Code Playgroud)

要么

print($grouparr[3]);
Run Code Online (Sandbox Code Playgroud)

会显示

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

      [3] => Array (
             [cust] => XT8816
             [type] => permier
             )
      )
Run Code Online (Sandbox Code Playgroud)


小智 6

这是我为同一个问题着陆的解决方案,包装为一个函数:

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

要通过名为"level"的键对$ myarray进行排序,请执行以下操作:

$myArray = arraySort($myArray,'level');
Run Code Online (Sandbox Code Playgroud)

或者,如果你不想将它作为一个函数,只是一次性使用,这将从$ myArray创建$ myNewArray,按键"级别"分组

foreach ($myArray as $key=>$val) $myNewArray[$val['level']][]=$val;
Run Code Online (Sandbox Code Playgroud)


Far*_*her 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');
Run Code Online (Sandbox Code Playgroud)

  • 这篇文章不仅没有很好地解释自己,而且没有按照 OP 的要求增加子数组键。此外,它甚至不尊重问题中的关键值——`account_id` 与这个问题无关。由于所有这些原因,我很惊讶它获得了如此多的赞成票,而我原则上反对票。证明:http://sandbox.onlinephpfunctions.com/code/28f553b4ee2670dc30cb448cfc039bb380b1cba4 我关心这个网站上旧内容的质量,因为我在适当的时候用它来结束新问题。 (2认同)