PHP странно вложенный ключ / массив значений — как преобразовать / отобразить, чтобы быть более удобным?

Microsoft QnAMaker API возвращает массив ключей / значений JSON (Metadata) в следующем формате:

$array = [[
"name" => "someName1",
"value" => "someValue1",
],
[
"name" => "someName2",
"value" => "someValue2",
],
..etc..
];

Как мне преобразовать его в следующий более удобный формат:

$array = [
"someName1" => "someValue1",
"someName2" => "someValue2",
..etc..
];

Я знаю, что могу сделать это с помощью цикла … Есть ли способ использовать встроенные функции?

Если цикл является единственным способом, как бы вы его написали и почему (производительность / читаемость / и т.д.)?

0

Решение

Если это выглядит JSONish, array_column помогает. Просто:

<?php
var_export(array_column($array, 'value', 'name'));

Выход:

array (
'someName1' => 'someValue1',
'someName2' => 'someValue2',
)
2

Другие решения

Это использует комбинацию array_map() переназначить каждый элемент, а затем array_merge() чтобы сгладить результаты …

print_r(array_merge(...array_map(function($data)
{ return [ $data['name'] => $data['value']]; }
, $array)));

Это не очень элегантно, и было бы интересно увидеть другие идеи по этому поводу.

Который дает…

Array
(
[someName1] => someValue1
[someName2] => someValue2
)
2

На самом деле, кроме цикла нет другого пути, поэтому просто переберите массив и создайте новый массив так, как вам нужно.

$new_array = [];
foreach($array as $row) {
$new_array[$row['name']] = $row['value'];
}

print_r($new_array);

Может быть несколько функций, которые вы можете связать вместе, чтобы делать то, что вы хотите, но в целом цикл, вероятно, будет более читабельным и более простым в целом.

2

Поскольку мой предыдущий ответ был дураком GrumpyCroutons, я решил переписать многие функции массива для хорошей меры. (Но не используйте это, просто сделайте простой foreach).

<?php
array_walk($array, function($v) use (&$result) {
$result[array_shift($v)] = array_values($v)[0];
});

var_export($result);

Выход:

array (
'someName1' => 'someValue1',
'someName2' => 'someValue2',
)
2

Это работает:

$res = [];
array_walk($array, function(&$e) use(&$res) {
$res[$e['name']] = $e['value'];
unset($e); // this line adds side effects and it could be deleted
});
var_dump($res);

Выход:

array(2) {
["someName1"]=> string(10) "someValue1"["someName2"]=> string(10) "someValue2"}
1

Вы можете просто использовать array_reduce:

<?php
$output = array_reduce($array, function($a, $b) {
$a[$b['name']] = $b['value'];

return $a;
});

var_export($output);

Выход:

array (
'someName1' => 'someValue1',
'someName2' => 'someValue2',
)
1

Получая смену (не foreach):

<?php
$c = $array;
while($d = array_shift($c))
$e[array_shift($d)] = array_shift($d);

var_export($e);

Выход:

array (
'someName1' => 'someValue1',
'someName2' => 'someValue2',
)

Хотя в комментариях к руководству это говорит о том, что переключение обходится дороже, чем сование. Вы можете заменить начальное присваивание $ c выше на array_reverse, а while-shift на while-pop.

Тем не менее, любой подход, вероятно, является паршивым по сравнению с foreach, но здесь для тех, кто знает, кто развлечение.

1
По вопросам рекламы [email protected]