将数组项的值设置为父数组的键(PHP)

时间:2016-01-25 12:53:05

标签: php arrays

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

Array
(
    [0] => Array
        (
            [id] => I100
            [name] => Mary
            [gender] => F
        )
    [1] => Array
        (
            [id] => I101
            [name] => John
            [gender] => M
        )
    [2] => Array
        (
            [id] => I245
            [name] => Sarah
            [gender] => F
        )
)

我想设置父数组的键值为id,因此结果数组如下所示:

Array
(
    [I100] => Array
        (
            [id] => I100
            [name] => Mary
            [gender] => F
        )
    [I101] => Array
        (
            [id] => I101
            [name] => John
            [gender] => M
        )
    [I245] => Array
        (
            [id] => I245
            [name] => Sarah
            [gender] => F
        )
)

如果可能的话,我想避免使用额外的循环来完成数组并创建一个新的数组来用正确的密钥存储每个项目,因为数组可能有数千个项目。

先谢谢!

3 个答案:

答案 0 :(得分:2)

尽管有人提出警告,但循环是一个明显的解决方案:

$newArray = [];
foreach($oldArray as $item)
    $newArray[$item['id']] = $item;

如果您遇到的问题不是专门针对循环,而是创建数组副本会导致内存消耗过多,那么您可以使用for循环编辑数组:

for($i=0; $i<count($oldArray); $i++){
    $oldArray[$oldArray[$i]['id']] = $oldArray[$i];
    unset($oldArray[$i]);
}

注意这是有效的,因为id元素是字母数字字符串,如果它们是简单的整数,那么上面的代码可以覆盖部分。

唯一的另一种解决方案是以类似的方式在第一个位置构建正确的数组。

例如,使用PDO::fetch代替PDO::fetchAll

//$newArray = $sth->fetchAll(PDO::FETCH_ASSOC);
$newArray = [];
while($row = $sth->fetch(PDO::FETCH_ASSOC))
    $newArray[$row['id']] = $row;

答案 1 :(得分:1)

在“动态”迭代数组时,无法覆盖键。所以这里是array_map的解决方案,它产生一个具有所需结构的数组:

// assuming $arr is your initial array
$result = [];

array_map(function($a) use (&$result){
    $result[$a['id']] = $a;
}, $arr);

// $result contains the needed array

答案 2 :(得分:0)

您可以在创建此阵列时添加所需的密钥。