PHP - 按键值分组数组

时间:2012-04-21 01:52:29

标签: php multidimensional-array group-by

尝试根据数组的索引是否可以对数组进行分组。我已经尝试过for循环和foreach循环的各种组合,如果($ i%3 == 0)......但是,它并没有输出我需要的方式。

这是一个大大简化的数组(原始数据包含很多高度敏感的信息......)

原始数组看起来与此相似:

$item[0]['Section 1']['Item 2'] => 1334;
$item[1]['Section 2']['Item 3'] => 15454;
$item[2]['Section 3']['Item 4'] => 1452;
$item[3]['Section 4']['Item 5'] => 1341;
$item[4]['Section 5']['Item 6'] => 1788655;
$item[5]['Section 6']['Item 7'] => 13;
$item[6]['Section 7']['Item 8'] => 142;
$item[7]['Section 8']['Item 9'] => 15678;
$item[8]['Section 9']['Item 10'] => 15542;
$item[9]['Section 10']['Item 11'] => 16578;
$item[10]['Section 11']['Item 12'] => 18452;
$item[11]['Section 12']['Item 13'] => 16565;

我正在尝试对每3条记录进行分组,如下所示:

$newitem[0]['Section 1']['Item 2'] => 1334;
$newitem[0]['Section 2']['Item 3'] => 15454;
$newitem[0]['Section 3']['Item 4'] => 1452;
$newitem[1]['Section 4']['Item 5'] => 1341;
$newitem[1]['Section 5']['Item 6'] => 1788655;
$newitem[1]['Section 6']['Item 7'] => 13;
$newitem[2]['Section 7']['Item 8'] => 142;
$newitem[2]['Section 8']['Item 9'] => 15678;
$newitem[2]['Section 9']['Item 10'] => 15542;
$newitem[3]['Section 10']['Item 11'] => 16578;
$newitem[3]['Section 11']['Item 12'] => 18452;
$newitem[3]['Section 12']['Item 13'] => 16565;

3 个答案:

答案 0 :(得分:0)

建议使用array_chunk http://www.php.net/manual/en/function.array-chunk.php

$item = array_chunk($item, 3);

$newItem = array ();
$x = 0;
$t = 0;
foreach ( $item as $value ) {
    if ($x < 3) {
        $newItem [$t] [$x] = $value;
        $x ++;
    } else {
        $t ++;
        $x = 0;
        $newItem [$t] = array ();
    }
}

var_dump ( $newItem );

答案 1 :(得分:0)

array_chunk是您需要的。并且您应该为二维数组迭代新数组,因为您可以看到新数组对于3个元素具有相同的索引0。

尝试:

http://www.php.net/manual/en/function.array-chunk.php

答案 2 :(得分:0)

这应该这样做:

$newindex = 0;
$newitem = array();
for($i = 0; $i < count($item); ++$i)
{
    $newindex = (int) $i / 3;
    if(!isset($newitem[ $newindex ]))
        $newitem[ $newindex ] = array();

    $newitem[ $newindex ] = array_merge($newitem[ $newindex ], $item[ $i ]);
}

Link to output(转储$newitem

诀窍是(int) $i / 3,它需要$i,将其除以3,然后转换为int,这会截断任何小数位。