Удалить только ключ из многомерного ассоциативного массива в PHP - PullRequest
0 голосов
/ 23 марта 2019

Я хочу удалить только ключ из многомерного ассоциативного массива, сохранив его значение в PHP.

Я пробовал с циклом foreach.

foreach($collections as $k=>$v){
            foreach($v as $k1=>$v1){
                foreach($v1 as $k2=>$v2){
                    if($k2 == 'attr_id'){
                        unset($collections[$k][$k1][$k2]);
                    }
                }
            }
        }

У меня есть массив, как показано ниже:

$collections = [
            0 => [
                0 => [
                    "attr_id" => 23,
                    "value" => "Single Side"
                ],
                1 => [
                    "attr_id" => 23,
                    "value" => "Double Side"
                ],
            ],
            1 => [
                0 => [
                    "attr_id" => 31,
                    "value" => "A4"
                ],
                1 => [
                    "attr_id" => 31,
                    "value" => "12x18"
                ],
                2 => [
                    "attr_id" => 31,
                    "value" => "B5"
                ],
                3 => [
                    "attr_id" => 31,
                    "value" => "A5"
                ]
            ]
        ];

И я хочу вывод Как:

$collections = [
            23 => [ "Single Side", "Double Side" ],
            31 => [ "A4", "12x18", "B5", "A5" ]
        ];

Пожалуйста, помогите!

Ответы [ 3 ]

2 голосов
/ 23 марта 2019

Краткое решение:

$expected = [];
foreach ($collections as $collection) {
    $expected[$collection[0]['attr_id']] = array_column($collection, 'value');
}
0 голосов
/ 23 марта 2019

Делай с array_values и array_reduce

  1. сначала объединить все вложенные массивы в один массив
  2. Использование уменьшить, чтобы добавить значение на основе attr_id соответствия

Демонстрация песочницы

$res = call_user_func_array('array_merge',array_values($arr));
$res = array_reduce($res,function($a,$b){
    $a[$b['attr_id']] = isset($a[$b['attr_id']]) ? $a[$b['attr_id']] : [] ;
    array_push($a[$b['attr_id']],$b['value']);
    return $a;
},[]);
    print_r($res);
0 голосов
/ 23 марта 2019

Вы можете сделать это, просто используя два цикла foreach() и нажав значение до attr_id

$expected = [];        
foreach($collections as $k=>$v){
    foreach($v as $k1=>$v1){
        $expected[$v1['attr_id']][] = $v1['value'];
    }
}
print_r($expected); 

Выход:

Array (
   [23] => Array ( 
            [0] => Single Side 
            [1] => Double Side 
          ) 
   [31] => Array ( 
            [0] => A4 
            [1] => 12x18
            [2] => B5
            [3] => A5 
         )
    )

DEMO: https://3v4l.org/JlsIl

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...