Сортировка многомерных массивов PHP

#php #arrays

#php #массивы

Вопрос:

У меня есть массив в виде

 Array
(
  [0] => Array
      (
          [attribute_pa_weight] => 500g-pack
      )
  [1] => Array
     (
        [attribute_pa_weight] => 1kg-pack
     )

 )
  

Потребуется, чтобы вывод был

    Array
  (
       [attribute_pa_weight] => Array
    (
        [0] => 500g-pack
        [1] => 1kg-pack
    )
  )
  

Требуется сортировка без указания значения ключа для сортировки, потому что они поступают динамически.

Ответ №1:

Здесь можно использовать PHP-функцию array_reduce:

 <?php
$a = [['attribute_pa_weight'=>'500g-pack'],['attribute_pa_weight'=>'1kg-pack']];

$res = array_reduce(
    $a, // source array
    function($acc, $el) {
        if (!isset($acc[key($el)])) $acc[key($el)] = [];
        array_push($acc[key($el)], $el[key($el)]);
        return $acc;
    },
    [] // initial result
);
    
print_r($res);
  

Вы можете попробовать код на PHPize.online

Ответ №2:

Другим кандидатом на эту работу был бы array_map!

 $input = [
    ['attribute_pa_weight' => '500g-pack'],
    ['attribute_pa_weight' => '1kg-pack'],
];

$output['attribute_pa_weight'] = array_map(fn ($v) => $v['attribute_pa_weight'], $input);

print_r($output);
  

Если вы не можете или не хотите использовать функции со стрелками (нужен PHP ^7.4.0 ).

 $output['attribute_pa_weight'] = array_map(function ($value) {
    return $value['attribute_pa_weight'];
}, $input);

print_r($output);
  

И если вы хотите, чтобы это было динамично, вы могли бы создать функцию.

 $merge = function ($name) use ($input) {
    return [$name => array_map(fn ($v) => $v[$name], $input)];
};

print_r($merge('attribute_pa_weight'));
  

Комментарии:

1. В OP не упоминается, какая сортировка требуется. Возможно, вы захотите показать, как сортировать конечный результат. Отличная работа.