【问题标题】:PHP multidimensional array conversion using array_map/array_walk functions使用 array_map/array_walk 函数的 PHP 多维数组转换
【发布时间】:2012-07-18 07:14:24
【问题描述】:

我有以下多维数组:

$userList = array(
    0 => array('id' => 1000, 'first_name' => 'John', 'last_name' => 'Smith'),
    1 => array('id' => 1001, 'first_name' => 'Sam', 'last_name' => 'Johnson'),
);

我想把它转换成数组,比如:

$userData = array(
    1000 => 'John Smith',
    1001 => 'Sam Johnson',
);

如何使用 foreach 循环实现这一点对我来说非常明显,但我想知道是否可以使用 array_map 或 array_walk 等 PHP 数组函数来实现这一点。回调函数请使用 PHP 5.3。谢谢!

【问题讨论】:

    标签: php multidimensional-array


    【解决方案1】:

    由于这些函数只适用于数组values,让它们在新数组中设置key 有点尴尬。一种方法是:

    $arr = array_combine(
        array_map(function ($i) { return $i['id']; }, $arr),
        array_map(function ($i) { return "$i[first_name] $i[last_name]"; }, $arr)
    );
    

    在这种情况下,foreach 更合适。

    【讨论】:

    • 好的,现在我确信foreach 更适合这种情况。
    【解决方案2】:

    函数式编程的一个小技巧。

    $arr = array_reduce(
      $arr,
      function ($result, $item) {
        $result[$item['id']] = $item['first_name'] . ' ' . $item['last_name'];
        return $result;
      },
      array()
    );
    

    array_reduce()

    【讨论】:

    • 不错的一个。不确定它是否真的比foreach 好。 ;)
    • 我通常使用 4 个空格来表示意图,是什么让它稍微更好地阅读。我也会使用对象来代替,这会导致像return array_merge($result,array($user->id => $user->getFullname()); 这样的回调。但是:也不知道:D
    【解决方案3】:

    代码:

    <?php
    
    function convertArray ( $array ) {
    
        $newUserList = array();
        foreach ( $array as $value ) {
            $newUserList[ $value[ 'id' ] ] = $value[ 'first_name' ] . ' ' . $value[ 'last_name' ];
        }
    
        return $newUserList;
    
    }   
    
    $userList = array(
        0 => array( 'id' => 1000, 'first_name' => 'John', 'last_name' => 'Smith' ),
        1 => array( 'id' => 1001, 'first_name' => 'Sam', 'last_name' => 'Johnson' )
    );
    
    $newUserList = convertArray( $userList );
    
    ?>
    

    输出:

    Array
    (
        [1000] => John Smith
        [1001] => Sam Johnson
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 2014-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多