Microsoft QnAMaker API以以下格式返回JSON键/值数组(Metadata
):
$array = [[
"name" => "someName1",
"value" => "someValue1",
],
[
"name" => "someName2",
"value" => "someValue2",
],
..etc..
];
如何将其转换为以下更可用的格式:
$array = [
"someName1" => "someValue1",
"someName2" => "someValue2",
..etc..
];
我知道我可以使用循环来实现...有没有办法利用内置函数?
如果循环是唯一的方法,您将如何编写它以及为什么(性能/可读性等)?
答案 0 :(得分:2)
除了循环外,实际上没有其他方法,因此只需遍历数组,然后按需要创建新数组即可。
$new_array = [];
foreach($array as $row) {
$new_array[$row['name']] = $row['value'];
}
print_r($new_array);
可能有一些功能可以组合在一起以执行所需的操作,但总的来说,循环可能更具可读性,并且总体上更容易。
答案 1 :(得分: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 :(得分: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',
)
答案 3 :(得分:2)
如果它看起来像JSONish,则array_column会有所帮助。简单地:
<?php
var_export(array_column($array, 'value', 'name'));
输出:
array (
'someName1' => 'someValue1',
'someName2' => 'someValue2',
)
答案 4 :(得分:1)
这有效:
$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"
}
答案 5 :(得分: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',
)
答案 6 :(得分: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',
)
尽管它在手册的注释中暗示,移位比弹出更为昂贵。您可以使用array_reverse替换上面对$ c的初始分配,并使用while-pop代替while-shift。
但是,与使用foreach相比,这两种方法都可能比较糟糕,但是这里是谁知道谁的娱乐性。