代码之家  ›  专栏  ›  技术社区  ›  Leo

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

  •  0
  • Leo  · 技术社区  · 7 年前

    Microsoft QnAMaker API正在返回一个JSON键/值数组( Metadata

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

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

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

    如果一个循环是唯一的方法,你会怎么写它,为什么(性能/可读性等)?

    7 回复  |  直到 7 年前
        1
  •  2
  •   Progrock    7 年前

    array_column 有帮助。简单地说:

    <?php
    var_export(array_column($array, 'value', 'name'));
    

    输出:

    array (
        'someName1' => 'someValue1',
        'someName2' => 'someValue2',
    )
    
        2
  •  2
  •   Nigel Ren    7 年前

    这使用了 array_map() 重新映射每个元素,然后 array_merge()

    print_r(array_merge(...array_map(function($data) 
                             { return [ $data['name'] => $data['value']]; }
                           , $array)));
    

    这不是很优雅,并将有趣的是看到其他想法围绕这一点。

    所以。。。

    Array
    (
        [someName1] => someValue1
        [someName2] => someValue2
    )
    
        3
  •  2
  •   GrumpyCrouton    7 年前

    $new_array = [];
    foreach($array as $row) {
        $new_array[$row['name']] = $row['value'];
    }
    
    print_r($new_array);
    

    可能有一些函数可以绑定在一起以执行所需的操作,但一般来说,循环的可读性更强,总体上更容易。

        4
  •  2
  •   Progrock    7 年前

    由于我之前的回答是一个恶作剧的格鲁皮克劳顿,我想我重写了许多数组函数的良好措施(但不要用这个,只要做一个简单的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',
    )
    
        5
  •  1
  •   pierDipi    7 年前

    这样做有效:

    $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" 
    } 
    
        6
  •  1
  •   Progrock    7 年前

    您只需使用array\u reduce:

    <?php
    $output = array_reduce($array, function($a, $b) {
        $a[$b['name']] = $b['value'];
    
        return $a;
    });
    
    var_export($output);
    

    输出:

    array (
        'someName1' => 'someValue1',
        'someName2' => 'someValue2',
    )
    
        7
  •  1
  •   Progrock    7 年前

    轮班时(非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\u reverse替换上面$c的初始赋值,用while pop替换while shift。