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

Posted

技术标签:

【中文标题】如何按特定的子数组值对多维数组进行分组?【英文标题】:How to group a multidimensional array by a particular subarray value? 【发布时间】:2011-01-12 11:25:00 【问题描述】:

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

我正在尝试按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
          )
)

我希望制作什么:

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

【问题讨论】:

请原谅我提出这个老问题,但是您是否希望外部键是 ASC?您的输入数组是否已经按级别排序? (因为那是发布的内容)。看看接受的答案如何处理无序输入数组:sandbox.onlinephpfunctions.com/code/… 最重要的是:这些数据是否来自数据库? 下面的许多答案不会增加子数组键。你_actually_需要增加子数组键吗? 【参考方案1】:

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

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

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

为您提供您想要的表格以及一起引用的所有内容。

如果可能的话,首先构建这样的数组。

【讨论】:

【参考方案2】:

您需要先按级别对其进行分组

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

print($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
             )
      )

【讨论】:

我认为上面代码中的“if”子句是多余的,因为“$grouparr[$val['level']][$newkey]=$val;”行适用于所有情况.换句话说,这条线也适用于'$templevel' 等于'$val['level']' 的情况。因此,在这种情况下,代码将是: $templevel=0; $新键=0; foreach ($items as $key => $val) $grouparr[$val['level']][$newkey]=$val; $新键++; 打印($grouparr);【参考方案3】:

这是我针对相同问题找到的解决方案,包装为函数:

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

要按名为“level”的键对 $myarray 进行排序,只需这样做:

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

或者,如果您不希望它作为一个函数,只是一次性使用,这将创建 $myNewArray 从 $myArray 按键 'level' 分组

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

【讨论】:

这是一个非常有用的答案。我正在尝试使用它,但要让 $val 成为唯一值。有什么建议吗? 这个答案没有提供 OP 所需的输出,因为它没有增加子数组键。证明:sandbox.onlinephpfunctions.com/code/…【参考方案4】:
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');

【讨论】:

这篇文章不仅在解释自己方面做得很差,而且没有按照 OP 的要求增加子数组键。此外,它甚至不尊重问题的关键价值——account_id 与这个问题无关。出于所有这些原因,我很惊讶它获得了如此多的赞成票,而我原则上投了反对票。证明:sandbox.onlinephpfunctions.com/code/…我关心这个网站上旧内容的质量,因为我会在适当的时候用它来关闭新问题。【参考方案5】:

最佳答案。

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

【讨论】:

不鼓励仅使用代码的答案。请单击编辑并添加一些单词来总结您的代码如何解决问题,或者解释您的答案与之前的答案/答案有何不同。谢谢【参考方案6】:
  $result = array();
    foreach ($yourArrayList as $data) 
        $id = $data['level'];
        if (isset($result[$id])) 
            $result[$id][] = $data;
         else 
            $result[$id] = array($data);
        
    

【讨论】:

纯代码答案在 *** 上的价值很低,因为它们在教育 OP 和未来的研究人员方面做得很差——每个答案(甚至是基本答案)都应该包含某种关于解决方案如何工作的解释以及为什么它是可取的。这个答案没有提供问题所要求的输出,因为它不会增加子数组键。证明:sandbox.onlinephpfunctions.com/code/…【参考方案7】:
function _group_by($array,$key,$keyName)
    
          $return = array();

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

      //end of function

【讨论】:

这个答案没有提供任何逻辑或解释。我不知道$key$keyName 是什么意思。我对这个答案投了反对票,因为我无法理解它,而且我不知道要为函数提供什么值。

以上是关于如何按特定的子数组值对多维数组进行分组?的主要内容,如果未能解决你的问题,请参考以下文章

按子项的值对多维数组进行排序

php 按特定键对多维数组进行排序

有没有办法在java中的多维数组中反转特定数组?

JavaScript:从数组中分组数据

php 按最接近数字的值对多维数组进行排序

Java中的多维数组按某列排序的方法