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);
可能有一些函数可以绑定在一起来做你想做的事情,但总的来说,循环可能会更具可读性,总体上更容易。
由于我之前的回答是脾气暴躁的骗子,我想我会用许多数组函数重写。 (但不要用这个,只是做一个简单的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相比,这两种方法都可能很糟糕,但在这里谁知道谁在娱乐。