如何防止array_merge重新编号数字键

时间:2011-08-22 04:26:39

标签: php arrays array-merge

我有一个看起来像这样的数组:

Array ( 
    [0] => Array ( [unit_id] => 1 [unit_name] => Clown Fish) 
    [1] => Array ( [unit_id] => L [unit_name] => Liter ) 
    [2] => Array ( [unit_id] => 2 [unit_name] => Elephant  ) 
    [3] => Array ( [unit_id] => 3 [unit_name] => Water Bottle ) 
    [4] => Array ( [unit_id] => 4 [unit_name] => Office Seating ) 
    [5] => Array ( [unit_id] => 5 [unit_name] => Green Green Grass ) 
)

然后,我写了一个函数

function array_to_list($arr_data, $str_key, $str_value) {
    $arr_list = array();
    if (is_array($arr_data)) {
        foreach($arr_data as $arr_value) {
            if (isset($arr_value[$str_key]) && isset($arr_value[$str_value])) {
                $arr_list = array_merge($arr_list, array($arr_value[$str_key] => $arr_value[$str_value]));
            }
        }
    }
    return $arr_list;
}

将数组转换为如下所示

Array ( 
    [1] => Clown Fish ) 
    [L] => Liter ) 
    [2] => Elephant ) 
    [3] => Water Bottle ) 
    [4] => Office Seating ) 
    [5] => Green Green Grass ) 
)

但是输出是

Array ( 
    [0] => Clown Fish ) 
    [L] => Liter ) 
    [1] => Elephant ) 
    [2] => Water Bottle ) 
    [3] => Office Seating ) 
    [4] => Green Green Grass ) 
)

我认为这与array_merge本身的性质有关,根据php手册“输入数组中带有数字键的值将使用从结果数组中的零开始的递增键重新编号。”

有没有办法可以生成有或没有array_merge的预期结果?

4 个答案:

答案 0 :(得分:17)

使用'+'运算符代替array_merge()

function array_to_list($arr_data, $str_key, $str_value) {
$arr_list = array();
if (is_array($arr_data)) {
    foreach($arr_data as $arr_value) {
        if (isset($arr_value[$str_key]) && isset($arr_value[$str_value])) {
            $arr_list = $arr_list + array($arr_value[$str_key] => $arr_value[$str_value]);
        }
    }
}
return $arr_list;

}

答案 1 :(得分:2)

为什么不尝试更简单的方法:

function array_to_list($arr_data, $str_key, $str_value) {
    $arr_list = array();
    if (is_array($arr_data)) {
        foreach($arr_data as $arr_value) {
            if (isset($arr_value[$str_key]) && isset($arr_value[$str_value])) {

                // This is the changed line:
                $arr_list[ $arr_value[$str_key] ] = $arr_value[$str_value];

            }
        }
    }
    return $arr_list;
}

这只是直接设置输出数组的值。没有理由创建一个新数组并每次合并它。它也应该快一点。

答案 2 :(得分:0)

删除array_merge()并将keyvalue追加到新的$arr_list

function array_to_list($arr_data, $str_key, $str_value) {
    $arr_list = array();
    if (is_array($arr_data)) {
        foreach($arr_data as $arr_value) {
            if (isset($arr_value[$str_key]) && isset($arr_value[$str_value])) {
                $arr_list[$arr_value[$str_key]] = $arr_value[$str_value];
            }
        }
    }
    return $arr_list;
}

答案 3 :(得分:-3)

防止重复编号数字键的简单技巧

如果两个数组都像 array('1'=>'XXX','2'=>'YYY');

,只需在数字键之前连接前导零 array('6'=>'AAA','7'=>'BBB'); 当您创建以 array('01'=>'XXX ','02'=>'YYY'); array('06'=>'AAA','07'=>'BBB'); ,然后使用 array_merge(),它将阻止重新编号数字键。当您使用标记数组时,请使用 ltrim()消除前导零。 希望这会对您有所帮助。