PHP 奇怪的嵌套键/值数组 - 如何转换/映射以使其更可用?



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相比,这两种方法都可能很糟糕,但在这里谁知道谁在娱乐。

最新更新