转换多维数组

Transforming multidimensional arrays

作为构建一些 json 从中构建依赖下拉列表的垫脚石,我想转换这个数组...

Array
(
    [0] => Array
        (
            [id] => 4
            [project_id] => 2289
            [task] => Drawing
        )

    [1] => Array
        (
            [id] => 5
            [project_id] => 2289
            [task] => Surveying
        )

    [2] => Array
        (
            [id] => 6
            [project_id] => 2289
            [task] => Meeting
        )

    [3] => Array
        (
            [id] => 1
            [project_id] => 2282
            [task] => Folding
        )

    [4] => Array
        (
            [id] => 2
            [project_id] => 2282
            [task] => Printing
        )

    [5] => Array
        (
            [id] => 3
            [project_id] => 2282
            [task] => Cutting
        )

)

..类似这样的事情...

Array
(
  [0] = Array
        (
        [project_id] => 2289
        [task] => Array
                  (
                  [0] => Drawing
                  [1] => Surveying
                  [2] => Meeting
                  )
        )
  [1] = Array
        (    
        [project_id] => 2282
        [task] => Array
                  (
                  [0] => Folding
                  [1] => Printing
                  [2] => Cutting
                  )
        )

)

正在使用...

$newArray = array();
foreach ($array as $row)
{
   $newArray[$row['project_id']][] = $row['task'];
}

...我能得到这个...

Array
(
    [2289] => Array
        (
            [0] => Drawing
            [1] => Surveying
            [2] => Meeting
        )

    [2282] => Array
        (
            [0] => Folding
            [1] => Printing
            [2] => Cutting
        )

)

...但我忘记了如何在结果中包含关联键

只需按您的意愿分配它们,索引中的 project id,然后 task 不断将其推到那里:

$newArray = array();
foreach ($array as $row) {
   $newArray[$row['project_id']]['project_id'] = $row['project_id'];
   $newArray[$row['project_id']]['task'][] = $row['task'];
}
$newArray = array_values($newArray); // reindex
// removes `$row['project_id']` on each group

注意:只需使用 array_values 重置您在 project id 分组中使用的分组键。

您只需使用 index:

即可修改您的 foreach
$newArray = array();
$index = array();
foreach ($array as $row)
{
    $found = array_search( $row['project_id'], $index );
    if( $found === False )
    {
        $found = array_push( $newArray, array( 'project_id' => $row['project_id'] ) )-1;
        $index[$found] = $row['project_id'];
    }
    $newArray[ $found ]['task'][] = $row['task'];
}

eval.in demo

当找到一个新的 project_id 键时,它被添加到 $index 数组中,所以——在下一个循环中搜索它——我可以检索相应的多维数组的索引。