按列对二维数组数据进行分组,并将原始行的索引推入组的子数组中

问题描述 投票:0回答:4

我有一个这样的数组:

array(
    [0] => array(
        'date' => '2017-12-20',
        'name' => 'test A',
        'kwa' => 'kwa1, kwa2'
    ),
    [1] => array(
        'date' => '2017-12-20',
        'name' => 'test B',
        'kwa' => ''
    ),
    [2] => array(
        'date' => '2017-12-21',
        'name' => 'test C',
        'kwa' => 'kwa1'
    ),
    [3] => array(
        'date' => '2017-12-22',
        'name' => 'test D',
        'kwa' => ''
    ),
    [4] => array(
        'date' => '2017-12-22',
        'name' => 'test E',
        'kwa' => ''
    ),
)

我想将所有具有同一天的元素分组到一个数组中。类似这样的东西:

array(
    ['2017-12-20'] => array( '0', '1'),
    ['2017-12-21'] => array( '2' ),
    ['2017-12-22'] => array( '3', '4' ),
)
php arrays multidimensional-array grouping sub-array
4个回答
2
投票

这是您的解决方案...

输入

<?php 
    $array = array(
        array(
            'date' => '2017-12-20',
            'name' => 'test A',
            'kwa' => 'kwa1, kwa2'
        ),array(
            'date' => '2017-12-20',
            'name' => 'test B',
            'kwa' => ''
        ),array(
            'date' => '2017-12-21',
            'name' => 'test C',
            'kwa' => 'kwa1'
        ),array(
            'date' => '2017-12-22',
            'name' => 'test D',
            'kwa' => ''
        ),array(
            'date' => '2017-12-22',
            'name' => 'test E',
            'kwa' => ''
        ),
    );

解决方案

    $new = array();
    foreach($array as $r){
       $new[$r['date']][] = array('name'=>$r['name'],'kwa' => $r['kwa']); 
    }
    echo "<pre>";print_r($new);

?>

输出

    Array
(
    [2017-12-20] => Array
        (
            [0] => Array
                (
                    [name] => test A
                    [kwa] => kwa1, kwa2
                )

            [1] => Array
                (
                    [name] => test B
                    [kwa] => 
                )

        )

    [2017-12-21] => Array
        (
            [0] => Array
                (
                    [name] => test C
                    [kwa] => kwa1
                )

        )

    [2017-12-22] => Array
        (
            [0] => Array
                (
                    [name] => test D
                    [kwa] => 
                )

            [1] => Array
                (
                    [name] => test E
                    [kwa] => 
                )

        )

)

2
投票
$arr = array();

foreach($array1 as $key => $item)
{
   $arr[$item['date']][$key] = $key;
}

echo "<pre>";
print_r($arr);

1
投票

我会使用类似以下的东西:

$array = [
    [
        'date' => '2017-12-20',
        'name' => 'test A',
        'kwa' => 'kwa1, kwa2'
    ],
    [
        'date' => '2017-12-20',
        'name' => 'test B',
        'kwa' => ''
    ],
    [
        'date' => '2017-12-21',
        'name' => 'test C',
        'kwa' => 'kwa1'
    ],
    [
        'date' => '2017-12-22',
        'name' => 'test D',
        'kwa' => ''
    ],
    [
        'date' => '2017-12-22',
        'name' => 'test E',
        'kwa' => ''
   ],
];

$formatted = [];
foreach ($array as $k => $v) {
    $formatted[$v['date']] = $formatted[$v['date']] ?? [];
    array_push($formatted[$v['date']], $k);
}

print_r($formatted);

0
投票

因为 PHP 的

foreach()
在每次迭代中在键之前赋值,所以可以实现无体循环。

数组解构语法用于为日期列值声明一个变量,然后将键作为新值推送到结果的特定于日期的子数组中。

代码:(演示

$result = [];
foreach ($array as $result[$d][] => ['date' => $d]);
var_export($result);

输出:

array (
  '2017-12-20' => 
  array (
    0 => 0,
    1 => 1,
  ),
  '2017-12-21' => 
  array (
    0 => 2,
  ),
  '2017-12-22' => 
  array (
    0 => 3,
    1 => 4,
  ),
)

相关阅读:在foreach()表达式中,value是定义在key之前还是之后?

© www.soinside.com 2019 - 2024. All rights reserved.