Microsoft QnAMaker API возвращает массив ключей / значений JSON (Metadata
) в следующем формате:
$array = [[
"name" => "someName1",
"value" => "someValue1",
],
[
"name" => "someName2",
"value" => "someValue2",
],
..etc..
];
Как мне преобразовать его в следующий более удобный формат:
$array = [
"someName1" => "someValue1",
"someName2" => "someValue2",
..etc..
];
Я знаю, что могу сделать это с помощью цикла … Есть ли способ использовать встроенные функции?
Если цикл является единственным способом, как бы вы его написали и почему (производительность / читаемость / и т.д.)?
Если это выглядит JSONish, array_column помогает. Просто:
<?php
var_export(array_column($array, 'value', 'name'));
Выход:
array (
'someName1' => 'someValue1',
'someName2' => 'someValue2',
)
Это использует комбинацию array_map()
переназначить каждый элемент, а затем array_merge()
чтобы сгладить результаты …
print_r(array_merge(...array_map(function($data)
{ return [ $data['name'] => $data['value']]; }
, $array)));
Это не очень элегантно, и было бы интересно увидеть другие идеи по этому поводу.
Который дает…
Array
(
[someName1] => someValue1
[someName2] => someValue2
)
На самом деле, кроме цикла нет другого пути, поэтому просто переберите массив и создайте новый массив так, как вам нужно.
$new_array = [];
foreach($array as $row) {
$new_array[$row['name']] = $row['value'];
}
print_r($new_array);
Может быть несколько функций, которые вы можете связать вместе, чтобы делать то, что вы хотите, но в целом цикл, вероятно, будет более читабельным и более простым в целом.
Поскольку мой предыдущий ответ был дураком 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',
)
Это работает:
$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"}
Вы можете просто использовать 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',
)
Получая смену (не 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, но здесь для тех, кто знает, кто развлечение.