PHP数组减少到子数组键

时间:2011-09-17 18:11:31

标签: php arrays multidimensional-array

我有一个像这样的数组

$users = array(
    [0] => array('Id' => 3, 'Name' => 'Bob'),
    [1] => array('Id' => 8, 'Name' => 'Alice'),
)

我希望将Ids'向上拉'一级,以便最终的数组为:

$usersById = array(
    [3] => array('Id' => 3, 'Name' => 'Bob'),
    [8] => array('Id' => 8, 'Name' => 'Alice'),
)

Id值是唯一的。

有原生的PHP方法吗?我目前使用的代码是:

$usersById = array();
foreach ($users as $key => $value)
{
    $usersById[$value['Id']] = $value;
}

这很有效,但并不是非常优雅。谢谢!

5 个答案:

答案 0 :(得分:17)

现代答案(需要PHP 5.5)

新功能array_column非常通用,它可以做的一件事就是这种类型的重建索引:

// second parameter is null means we 're just going to reindex the input
$usersById = array_column($users, null, 'Id');

原始答案(适用于早期的PHP版本)

您需要使用array_map从子数组中获取ID,然后使用array_combine创建一个新数组:

$ids = array_map(function($user) { return $user['Id']; }, $users);
$users = array_combine($ids, $users);

上面的代码对于匿名函数语法需要PHP> = 5.3,但您也可以使用create_function执行相同操作(尽管看起来有点丑陋),只需要PHP> = 4.0.1 :

$ids = array_map(create_function('$user', 'return $user["Id"];'), $users);
$users = array_combine($ids, $users);

<强> See it in action

答案 1 :(得分:10)

您可以使用array_reduce()功能,例如:

$usersById = array_reduce($users, function ($reduced, $current) {
    $reduced[$current['Id']] = $current;
    return $reduced;
});

然而,它并不比foreach更优雅。

答案 2 :(得分:2)

我认为使用foreach会更优雅。也许你只是想以不同的方式写它:

$keyed = array();
foreach($users as $w) $keyed[$w['Id']] = $w;

如果您想要替换现有数组,foreach确实不灵活。但也许以下是某种替代方案:

$users = function($key) use ($users)
{
    foreach($users as $v) $keys[] = $v[$key];
    return array_combine($keys, $users);
};
$users = $users('Id');

它允许回调接受参数,例如应该用来创建新密钥的密钥的名称。

答案 3 :(得分:1)

还有一个使用array_walk的变种:

$usersById = array();
array_walk($users, function($val) use (&$usersById) {
    $usersById[$val['Id']] = $val;
});

答案 4 :(得分:-2)

 $usersById = array_combine(array_keys($users), array_values($users));