我有一个像这样的数组
$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;
}
这很有效,但并不是非常优雅。谢谢!
答案 0 :(得分:17)
新功能array_column
非常通用,它可以做的一件事就是这种类型的重建索引:
// second parameter is null means we 're just going to reindex the input
$usersById = array_column($users, null, 'Id');
您需要使用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));