如何在新的赋值后保持先前的值在数组中


How to keep the previous values in array after new assignment?

我有一个名为$arr = array的数组。它的一些键有值,像这样:

$arr['1'] = 'one';
$arr['2'] = 'two';
$arr['3'] = 'three';

现在我用另一个数组初始化这个数组,就像这样:

$arr = array('4' => 'four', '5' => 'five');

但是我需要保留之前的值。我的意思是,当我输出这个数组时,输出会像这样:

echo '<pre>';
print_r($arr);
/* ---- output:
    Array
    (
    [4] => four
    [5] => five
    )
*/

我想要这样的输出:

    Array
    (
    [1] => one
    [2] => two
    [3] => three
    [4] => four
    [5] => five
    )

所以,我怎么能照顾旧键(值)后重新初始化?

下面是你的选项:array_merge, union (+ operator), array_push,直接设置键,用你自己的自定义规则创建一个函数来循环遍历数组。

样本数据:

$test1 = array('1'=>'one', '2'=>'two', '3'=>'three', 'stringkey'=>'string');
$test2 = array('3'=>'new three', '4'=>'four', '5'=>'five', 'stringkey'=>'new string');

array_merge(如在其他答案中所见)将把数字键(甚至是数字字符串)重新索引为零,并在末尾添加新的数字索引。非数字字符串索引将用后一个数组的值覆盖前一个数组中存在索引的值。

$combined = array_merge($test1, $test2);

结果(http://codepad.viper - 7. - com/c9qipe):

Array
(
    [0] => one
    [1] => two
    [2] => three
    [stringkey] => new string
    [3] => new three
    [4] => four
    [5] => five
)

联合将组合数组,但字符串键和数字键的处理方式相同。新索引将被添加,现有索引NOT将被覆盖。

$combined = $test1 + $test2;

结果(http://codepad.viper - 7. - com/8z5g26):

Array
(
    [1] => one
    [2] => two
    [3] => three
    [stringkey] => string
    [4] => four
    [5] => five
)

array_push允许在数组中添加键。因此,只要新键是数字和顺序的,就可以将其推到数组的末尾。但请注意,后一个数组中的非数字字符串键将被重新索引为现有数组中最高的数字索引+1。如果没有数字键,这将是零。您还需要将每个新值作为单独的参数引用(参见下面的参数2和3)。另外,由于第一个参数是通过引用接受的,因此它将修改原始数组。其他选项允许您在需要原始数组时组合成一个单独的数组。

array_push($test1, 'four', 'five');

结果(http://codepad.viper - 7. - com/5b9nvc):

Array
(
    [1] => one
    [2] => two
    [3] => three
    [stringkey] => string
    [4] => four
    [5] => five
)

你也可以直接设置键。

$test1['4'] = 'four';
$test1['5'] = 'five';

或者甚至只是创建一个循环并将其包装在一个函数中,以处理合并

的自定义规则。
function custom_array_merge($arr1, $arr2){
    //loop over array 2
    foreach($arr2 as $k=>$v){
        //if key exists in array 1
        if(array_key_exists($arr1, $k)){
            //do something special for when key exists
        } else {
            //do something special for when key doesn't exists
            $arr1[$k] = $v;
        }
    }
    return $arr1;
}

函数可以扩展为使用func_get_args之类的东西来允许任意数量的参数。

我敢肯定还有更"hack"的方法来做到这一点,比如使用array_Splice或其他数组函数。然而,在我看来,我会避免使用它们,只是为了让代码更清楚地表明你在做什么。

use array_merge:

$arr = array_merge($arr, array('4' => 'four', '5' => 'five'));

好吧,根据注释(这是正确的),这将重新索引数组,另一个解决方案,以避免这样做:

array_push($arr, "four", "five");

但是如果你有不同的键,比如字符串不是被屏蔽的数字,这将不起作用。

另一种方法是使用+来合并它们维护键:

$arr['1'] = 'one';
$arr['2'] = 'two';
$arr['3'] = 'three';
$arr2 = array('4' => 'four', '5' => 'five');
$arr = $arr + $arr2;

另一种保存数组键的方法是使用array_replace。

$arr['1'] = 'one';
$arr['2'] = 'two';
$arr['3'] = 'three';
print_r(array_replace($arr, array('4' => 'four', '5' => 'five')));
输出:

Array
(
    [1] => one
    [2] => two
    [3] => three
    [4] => four
    [5] => five
)