在PHP中是否有类似于多维数组的array_column函数?

5

是否有类似于 array_column 的函数适用于多维数组?是否有一种函数可以将以下第一个数组翻译成第二个数组:

Array
(
    [0] => Array
        (
            [foodType] => fruits
            [itemID] => 1
            [itemName] => apple
        )

    [1] => Array
        (
            [foodType] => fruits
            [itemID] => 2
            [itemName] => banana
        )

    [2] => Array
        (
            [foodType] => veggies
            [itemID] => 3
            [itemName] => carrot
        )

    [3] => Array
        (
            [foodType] => veggies
            [itemID] => 4
            [itemName] => broccoli
         )

)

生成的数组:

Array
(
    [fruits] => Array
        (
            [0] => Array
                (
                    [itemID] => 1
                    [itemName] => apple
                )

            [1] => Array
                (
                    [itemID] => 2
                    [itemName] => banana
                )

        )

    [veggies] => Array
        (
            [0] => Array
                (
                    [itemID] => 3
                    [itemName] => carrot
                )

            [1] => Array
                (
                    [itemID] => 4
                    [itemName] => broccoli
                 )
        )

)

https://dev59.com/22cs5IYBdhLWcg3wmlSk#39208133 - mickmackusa
虽然没有解决问题,但这是一个很好的参考,可以了解如果仅使用 array_column 处理数组会发生什么。https://dev59.com/uJvga4cB1Zd3GeqP9O37 - Ng Sek Long
4个回答

4
不,本地没有获取所需输出的函数,但是你可以制作自己的函数,只需使用 array_column 获取类型/列,然后在数组上循环,在匹配时删除项目以避免重复迭代。
类似这样的东西:
<?php
$data = [
    ['foodType' => 'fruits', 'itemID' => 1, 'itemName' => 'apple'],
    ['foodType' => 'fruits', 'itemID' => 2, 'itemName' => 'banana'],
    ['foodType' => 'veggies', 'itemID' => 3, 'itemName' => 'carrot'],
    ['foodType' => 'veggies', 'itemID' => 4, 'itemName' => 'broccoli']
];

function array_column_multi ($array, $column) {
    $types = array_unique(array_column($array, $column));

    $return = [];
    foreach ($types as $type) {
        foreach ($array as $key => $value) {
            if ($type === $value[$column]) {
                unset($value[$column]);
                $return[$type][] = $value;
                unset($array[$key]);
            }
        }
    }
    return $return;
}


print_r(array_column_multi($data, 'foodType'));

https://3v4l.org/KQVeN

Result:

Array
(
    [fruits] => Array
        (
            [0] => Array
                (
                    [itemID] => 1
                    [itemName] => apple
                )

            [1] => Array
                (
                    [itemID] => 2
                    [itemName] => banana
                )

        )

    [veggies] => Array
        (
            [0] => Array
                (
                    [itemID] => 3
                    [itemName] => carrot
                )

            [1] => Array
                (
                    [itemID] => 4
                    [itemName] => broccoli
                )

        )

)

0

哦,我刚刚注意到你正在按ID聚合它们。没有这样的功能,你需要用循环迭代输入,然后用想要的数据填充输出数组。例如:

$output = [];

foreach($input_array as $item) {
  $output[$item['id']][] = [
     'itemID' => $item['itemID'],
     'itemName' => $item['itemName']
  ];
}

-1

虽然这是一个比较老的问题,但我希望它能对某些人有所帮助。不幸的是,目前还没有原生函数可以实现,但可以使用 PHP 的 array_filter() 函数来实现输出:

$foods = [
    [
        'foodType' => 'fruits',
        'itemID' => 1,
        'itemName' => 'apple',
    ],

    [
        'foodType' => 'fruits',
        'itemID' => 2,
        'itemName' => 'banana',
    ],

    [
        'foodType' => 'veggies',
        'itemID' => 3,
        'itemName' => 'carrot',
    ],

    [
        'foodType' => 'veggies',
        'itemID' => 4,
        'itemName' => 'broccoli',
    ]

];

$grouped_foods = [];
$groupByColumn = 'foodType';

array_filter($foods, function ($foodItem) use(&$grouped_foods, $groupByColumn) {
    $grouped_foods[$foodItem[$groupByColumn]][] = array_filter($foodItem, function ($key) use($groupByColumn) {
        return $key != $groupByColumn;
    }, ARRAY_FILTER_USE_KEY);
});


echo "<pre>";
print_R($grouped_foods);
echo "</pre>";

查看实际效果:https://3v4l.org/bbX5A

免责声明:对于/foreach循环在性能上比本地数组函数快得多。


-1
我更喜欢使用以下解决方案。 示例
  "allergens" => array:5 [
    0 => array:2 [
      "id" => "10"
      "object" => array:1 [
        "allergens" => "10"
      ]
    ]
    1 => array:2 [
      "id" => "11"
      "object" => array:1 [
        "allergens" => "11"
      ]
    ]
    2 => array:2 [
      "id" => "4"
      "object" => array:1 [
        "allergens" => "4"
      ]
    ]
  ]

以此示例为例,如果您想要一个仅包含allergens值的数组,则使用以下代码。

解决方案

$allergens = array_map( function ( $ar ) {
   return $ar['allergens'];
}, array_column( $allergensArr, 'object' ) );

结果

array:5 [
  0 => "10"
  1 => "11"
  2 => "4"
]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接