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

8

i have an array which looks like this:

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或不使用它来产生预期的结果?


3
http://www.programmingfacts.com/merging-arrays-with-reindex-and-without-reindexing/ - PlagueEditor
谢谢你回答得这么快。对于我来说,看到解决方案如此简单却之前在谷歌搜索时找不到,真是有点尴尬。谢谢你。 - dqiu
3个回答

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
这正是我所需要的(为了更简单的目的)...在具有数字键的数组前面添加一个“0”键,而无需重新编号键。 - lhagemann

1
为什么不尝试一种更简单的方法呢:
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;
}

这只是直接在输出数组上设置值。每次都创建一个新数组并合并它没有任何意义,而且这样做应该会更快。


我想知道为什么你的解决方案之前没有浮现在我的脑海中。谢谢。我认为更快速地进行操作,能够节省开销而不是使用旧方法。 - dqiu

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;
}

$arr_list = $arr_list + (array($arr_value[$str_key] => $arr_value[$str_value])); 请将上述代码翻译为中文。 - Mihai Iorga
我实际上两个都在用 :D。这对我来说是一种锻炼。谢谢。 - dqiu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接