PHP数组减少到子数组键

Har*_*per 6 php arrays multidimensional-array

我有这样的数组

$users = array(
    [0] => array('Id' => 3, 'Name' => 'Bob'),
    [1] => array('Id' => 8, 'Name' => 'Alice'),
)
Run Code Online (Sandbox Code Playgroud)

我想将Ids'向上拉'一级,以便最终的数组是:

$usersById = array(
    [3] => array('Id' => 3, 'Name' => 'Bob'),
    [8] => array('Id' => 8, 'Name' => 'Alice'),
)
Run Code Online (Sandbox Code Playgroud)

Id值是唯一的.

是否有本机PHP方式来做到这一点?我目前使用的代码是:

$usersById = array();
foreach ($users as $key => $value)
{
    $usersById[$value['Id']] = $value;
}
Run Code Online (Sandbox Code Playgroud)

这有效,但不是非常优雅.谢谢!

Jon*_*Jon 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');
Run Code Online (Sandbox Code Playgroud)

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

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

$ids = array_map(function($user) { return $user['Id']; }, $users);
$users = array_combine($ids, $users);
Run Code Online (Sandbox Code Playgroud)

上面的代码要求PHP> = 5.3用于匿名函数语法,但你也可以做同样的事情(虽然它看起来有点丑陋)create_function,只需要PHP> = 4.0.1:

$ids = array_map(create_function('$user', 'return $user["Id"];'), $users);
$users = array_combine($ids, $users);
Run Code Online (Sandbox Code Playgroud)

看到它在行动.


sal*_*the 10

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

$usersById = array_reduce($users, function ($reduced, $current) {
    $reduced[$current['Id']] = $current;
    return $reduced;
});
Run Code Online (Sandbox Code Playgroud)

然而,它并不比a更优雅foreach.

  • “但是,它并不比 `foreach` 更优雅。” - 除了它是声明性的,原始的 `$users` 数组没有改变,你可以动态地通过回调传递给 `array_reduce` :) (2认同)