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

Php 如何按特定子数组值对多维数组进行分组?,php,arrays,multidimensional-array,grouping,Php,Arrays,Multidimensional Array,Grouping,我有一个多维数组,并试图根据特定列中的值对它们进行分组 我试图按级别对它们进行分组,但实际上我事先并不知道级别。所以,我不能把它放在for循环中,在$I$val的项目){$grouparr[$val['level']][$newkey]=$val;$newkey++;}打印($grouparr); function _group_by($array,$key,$keyName) { $return = array(); foreach($arra

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

我试图按
级别对它们进行分组,但实际上我事先并不知道级别。所以,我不能把它放在
for
循环中,在$I<7
时说
,因为我不知道
7
是level键的最大值,坦率地说,我不确定我是否需要这样做,即使我这样做了

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

您需要首先按级别对它们进行分组

使用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);

打印的输出($grouparr)将按您希望的格式显示

你也可以试着

print($grouparr[7]);
将显示

 [7] => Array (
      [4] => Array (
             [cust] => XT7434
             [type] => standard
             )
      )
[3] => Array (
      [2] => Array (
             [cust] => XT8922
             [type] => premier
             )

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

将显示

 [7] => Array (
      [4] => Array (
             [cust] => XT7434
             [type] => standard
             )
      )
[3] => Array (
      [2] => Array (
             [cust] => XT8922
             [type] => premier
             )

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

如果您可以控制初始数组的构建,那么最好的方法就是在添加条目时在开始时这样设置

如果没有,则构建一个临时数组进行排序:

foreach ($input_arr as $key => &$entry) {
    $level_arr[$entry['level']][$key] = $entry;
}
留给您想要的表单和所有引用的内容


如果可能的话,首先要像这样构建阵列。

下面是我为一个相同问题找到的解决方案,包装为函数:

function arraySort($input,$sortkey){
  foreach ($input as $key=>$val) $output[$val[$sortkey]][]=$val;
  return $output;
}
要按名为“level”的键对$myarray进行排序,只需执行以下操作:

$myArray = arraySort($myArray,'level');
或者,如果您不想将其作为一个函数,只需一次性使用,则可以从按键“level”分组的$myArray创建$myNewArray

foreach ($myArray as $key=>$val) $myNewArray[$val['level']][]=$val;
最佳答案

    $levels = array_unique(array_column($records, 'level'));

    $data = array();

    foreach($records as $key => $value){ 

    $data[$levels[array_search($value['level'],$levels )]][] = $value ; 

    }

    print_r($data); 

这是一个非常有用的答案。我试图使用它,但要使$val成为唯一的值。建议?此答案不提供OP所需的输出,因为它不增加子数组键。证据:请原谅我挑起了这个老问题,但你是否希望外键是ASC?您的输入数组是否已按级别排序?(因为这就是发布的内容)。查看接受的答案在未排序的输入数组中的行为:最重要的是:此数据是否来自数据库?下面的许多答案不会增加子数组键。你真的需要增加子数组键吗?这篇文章不仅解释得不好,而且没有按照OP的要求增加子数组键。此外,它甚至没有让问题中的键值有尊严--
account\u id
与这个问题无关。出于所有这些原因,我感到惊讶的是,它获得了如此多的赞成票,而我原则上却投了反对票。证据:我关心这个网站上旧内容的质量,因为我在适当的时候用它来解决新问题。代码答案在StackOverflow上的价值很低,因为它们在教育OP和未来的研究人员方面做得很差——每一个答案(甚至是基本答案)应该包括一些关于解决方案如何工作以及为什么它是可取的解释。这个答案不提供问题所要求的输出,因为它不增加子数组键。证据:这个答案既没有逻辑也没有解释。我不知道
$key
$keyName
是什么意思。我对这个答案投了反对票,因为我无法理解它,也不知道该给函数提供什么值。不鼓励只使用代码的答案。请单击“编辑”并添加一些文字,总结您的代码如何解决问题,或者解释您的答案与以前的答案有何不同。谢谢我认为上面代码中的'if'子句是多余的,因为“$grouparr[$val['level']][$newkey]=$val;”行适用于所有情况。换句话说,对于“$templevel”等于“$val['level']”的情况,这一行也适用。因此,在这种情况下,代码应该是:$templevel=0$newkey=0;foreach($key=>$val的项目){$grouparr[$val['level']][$newkey]=$val;$newkey++;}打印($grouparr);
function _group_by($array,$key,$keyName)
    {
          $return = array();

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

    }  //end of function
    $levels = array_unique(array_column($records, 'level'));

    $data = array();

    foreach($records as $key => $value){ 

    $data[$levels[array_search($value['level'],$levels )]][] = $value ; 

    }

    print_r($data);