按列值对二维数组的行进行分组,并将整行推入子数组中

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

我有一个

uploads
数组,如下所示:

$uploads[0] = array('type' => 'upload', 'label' => 'blah');
$uploads[1] = array('type' => 'upload', 'label' => 'blah');
$uploads[2] = array('type' => 'upload', 'label' => 'blah');
$uploads[3] = array('type' => 'upload', 'label' => 'foobar');

我想创建这个数组:

$upload_fields = array(
   'blah' => array(
               array('type' => 'upload', 'label' => 'blah')
               array('type' => 'upload', 'label' => 'blah')
               array('type' => 'upload', 'label' => 'blah')
    ),
   'foobar' => array(
               array('type' => 'upload', 'label' => 'foobar')    
    )
);

基本上我想根据标签对数组进行分组。要分组的数组是动态的,否则我可以这样做:

$array_group_1 = array();
$array_group_2 = array();

foreach($uploads as $upload) {
    if($upload['label'] == 'blah') {
        array_push($array_group_1, $upload);
    }  else {
        array_push($array_group_2, $upload);        
    }
}

$upload_fields = array(
    'blah' => $array_group_1,
    'foobar' => $array_group_2
);

但是由于按键是动态的,我怎样才能实现这一点?

php arrays multidimensional-array grouping sub-array
3个回答
2
投票

这就是我想到的:

$uploads[0] = array('type' => 'upload', 'label' => 'blah');
$uploads[1] = array('type' => 'upload', 'label' => 'blah');
$uploads[2] = array('type' => 'upload', 'label' => 'blah');
$uploads[3] = array('type' => 'upload', 'label' => 'foobar');

foreach($uploads as $u){
    $upload_fields[$u['label']][] = $u;
}

echo '<pre>',print_r($upload_fields),'</pre>';

1
投票

有很多奇特的数组函数可以用来获取动态数组键和值http://www.php.net/manual/en/ref.array.php

可以通过压缩该

if else
语句来优化以下代码,但我这样保留它是为了使示例非常清晰

$uploads[0] = array('type' => 'upload', 'label' => 'blah');
$uploads[1] = array('type' => 'upload', 'label' => 'blah');
$uploads[2] = array('type' => 'upload', 'label' => 'blah');
$uploads[3] = array('type' => 'upload', 'label' => 'foobar');

$result = array();

foreach($uploads AS $upload)
{
    if(array_key_exists($upload['label'], $result))
    {
        array_push($result[$upload['label']], $upload);
    }
    else
    {
        $result[$upload['label']] = array();
        array_push($result[$upload['label']], $upload);
    }
}

var_dump($result);

0
投票
$temp = array();
$final_array = array();

foreach($uploads as $upload){
    if(!in_array($upload['label'], $temp)){
        $final_array[$upload['label']] = array('type' => upload['type'], 'label' => $temp);
        $temp[] = $upload['label'];
    }
}

var_dump($final_array);
© www.soinside.com 2019 - 2024. All rights reserved.