【问题标题】:how to prevent array_merge to renumber numeric keys如何防止 array_merge 重新编号数字键
【发布时间】:2011-10-31 20:56:35
【问题描述】:

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

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 的情况下产生预期的结果?

【问题讨论】:

  • 感谢您这么快回答。看到解决方案如此简单,我感到很尴尬,但我在前一段时间谷歌搜索时找不到它。谢谢。

标签: php arrays array-merge


【解决方案1】:

使用“+”运算符代替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;

}

【讨论】:

  • 这正是我所需要的(为了更简单的目的)...在不重新编号的情况下将“0”键添加到带有数字键的数组中。
【解决方案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;
}

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

【讨论】:

  • 我想知道为什么您的解决方案没有早点出现在我的脑海中。谢谢。速度更快,我想我可以节省开销而不是旧的。
【解决方案3】:

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

【讨论】:

  • 或者像@PlagueEditor说的:$arr_list = $arr_list + (array($arr_value[$str_key] => $arr_value[$str_value]));
  • 我实际上都在使用:D。对我来说是一种锻炼。谢谢。
猜你喜欢
  • 2011-01-23
  • 1970-01-01
  • 2011-08-21
  • 2016-03-25
  • 1970-01-01
  • 2011-01-01
  • 2015-01-10
  • 1970-01-01
  • 2021-12-09
相关资源
最近更新 更多