【问题标题】:In php is there a function like array_column for multidimensional arrays [duplicate]在 php 中是否有类似 array_column 的函数用于多维数组 [重复]
【发布时间】:2018-10-15 12:25:01
【问题描述】:

对于多维数组,是否有类似于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
                 )
        )

)

【问题讨论】:

标签: php arrays multidimensional-array array-column


【解决方案1】:

哦,我刚刚注意到您正在按 ID 聚合它们。没有一个功能,您将需要使用循环遍历输入,并使用您想要的数据填充输出数组。例如:

$output = [];

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

【讨论】:

    【解决方案2】:

    不,虽然您可以创建自己的函数,但没有一个函数可以本地获取您的预期输出,只需使用 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

    结果:

    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
                    )
    
            )
    
    )
    

    【讨论】:

      【解决方案3】:

      相当老的问题,但我希望它对某人有所帮助。不幸的是,还没有本机功能,但使用 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

      免责声明:for/foreach 循环的性能明显快于原生数组函数。

      【讨论】:

        【解决方案4】:

        我更喜欢使用以下解决方案。

        示例

          "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"
        ]
        

        【讨论】:

          猜你喜欢
          • 2019-06-04
          • 1970-01-01
          • 2020-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-08
          • 2011-03-27
          • 2019-12-01
          相关资源
          最近更新 更多