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

时间:2018-10-23 17:41:45

标签: php arrays json qnamaker

Microsoft QnAMaker API以以下格式返回JSON键/值数组(Metadata):

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

如何将其转换为以下更可用的格式:

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

我知道我可以使用循环来实现...有没有办法利用内置函数?

如果循环是唯一的方法,您将如何编写它以及为什么(性能/可读性等)?

7 个答案:

答案 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相比,这两种方法都可能比较糟糕,但是这里是谁知道谁的娱乐性。