通过' id'重新组织数组嵌套数组的索引

时间:2011-12-06 23:48:23

标签: php arrays

我有一个如下所示的数组:

Array([0]=>Array([id]=>7 [name]=foo) [1]=>Array([id]=>10 [name]=bar) [2]=>Array([id]=>15 [name]=baz))

每个索引都包含另一个包含各种元素的数组,包括'id'。我想“上升”一个级别,以便我的顶级数组被相应嵌套数组的ID元素索引,但该索引仍然包含一个包含子数组中所有元素的数组?

换句话说,我如何使用PHP将上面的数组转换为:

Array([7]=>Array([id]=>7 [name]=foo) [10]=>Array([id]=>10 [name]=bar) [15]=>Array([id]=>15 [name]=baz))

3 个答案:

答案 0 :(得分:3)

您需要做的是从输入中的每个子数组中提取ID。如果你将这些作为一个id数组,你只需要array_combine调用重新索引原始数组就可以使用这些id作为键。

您可以使用array_map生成这样的ID数组,这会导致:

// input data
$array = array(array('id' => '7', 'name' => 'foo'),array('id' => 10, 'name' => 'bar'));

// extract ids from the input array
$ids = array_map(function($arr) { return $arr['id']; }, $array);

// "reindex" original array using ids as array keys, keep original values
$result = array_combine($ids, $array);

print_r($result);

我用于匿名函数的语法(array_map的第一个参数)需要PHP> = 5.3,但是你可以使用create_function来实现相同的(虽然不太方便)任何你不会因为使用而感到羞耻的PHP版本。

<强> See it in action

答案 1 :(得分:1)

试试这个:

 $newArray = array();
 foreach($oldArray as $key => $value) {
    $newArray[$value['id']] = $value;
 }

答案 2 :(得分:0)

从 PHP 5.5.0 开始,您可以使用 array_column() 代替 array_map() 来缩短代码。

$result = array_combine(array_column($array, 'id'), $array);