为了账号安全,请及时绑定邮箱和手机立即绑定

array_replace_recursive 覆盖键而不是附加键

array_replace_recursive 覆盖键而不是附加键

PHP
哈士奇WWW 2022-11-04 17:11:11
我试图用另一个数组覆盖或替换一个数组。为此,我尝试了 array_replace_recursive 函数,但我得到了我似乎无法清除的不需要的行为。我有两个数组:原始数组:[test] => Array             [me] => Array                     [0] => test                     [1] => me                     [2] => now             [me2] => Array                     [0] => test                     [1] => me                     [2] => now我要替换的数组[test] => Array             [me2] => Array                     [name] => firstname                     [last] => lastname使用 array_replace_recursive($first_array, $second_array) 后,我得到以下输出: [test] => Array             [me] => Array                     [0] => test                     [1] => me                     [2] => now             [me2] => Array                     [0] => test <-- this needs to be overwritten not appended                     [1] => me <-- this needs to be overwritten not appended                     [2] => now <-- this needs to be overwritten not appended                     [name] => firstname                     [last] => lastname我真的需要覆盖 ['test']['me2'] 值而不是附加。所以 0,1,2 键应该消失了。有人可以在这里指出我正确的方向吗?
查看完整描述

2 回答

?
幕布斯7119047

TA贡献1794条经验 获得超8个赞

您可能必须编写自己的函数,以您认为合适的方式进行替换。我认为应该:

  • 接受两个数组 ($a,$b) 作为参数

  • 如果 $a[KEY] 是一个数组且 $b[KEY] 未设置,则保留 $a[KEY]

  • 如果 $a[KEY] 是一个数组并且 $b[KEY] 是一个数组,调用这个方法 w/ ($a[KEY] & $b[KEY])

  • 如果 $a 的子节点不是数组且 $b 有子节点,则将 $a 替换为 $b

或者类似的东西......我很难概念化你到底需要什么,并为它编写一个函数,我意识到有些极端情况可能会出现在更复杂的数组中。

所以我写了这个函数和测试。我只使用您提供的示例数组对其进行了测试,但它提供了正确的输出。如果您向数组添加另一层,或者其中有一个数组,其中有一些是数组的孩子和一些不是数组的孩子,这可能会出现问题。

<?php


function recurseReplace($a,$b){

    $ret = [];

    foreach ($a as $key=>$value){

        if (!isset($b[$key])&&is_array($value)){

            $ret[$key] = $value;

            continue;

        } 

        if (is_array($value)&&isset($b[$key])&&is_array($b[$key])){

            $ret[$key] = recurseReplace($value,$b[$key]);

            continue;

        }

    }

    if (count($ret)==0){

        foreach ($b as $key=>$value){

            $ret[$key] = $value;

        }

    }

    return $ret;

}


$a = [

    "test" => [

        "me"=>['test','me','now'],

        "me2"=>["test",'me','now']

        ]

    ];


$b = [

    "test" => [

        "me2"=>["name"=>'firstname',"last"=>"lastname"]

        ]

    ];


$desired = [

    "test" => [

        "me"=>['test','me','now'],

        "me2"=>["name"=>'firstname',"last"=>"lastname"]

        ]

    ];


$final = recurseReplace($a,$b);

echo "\n\n-----final output::---\n\n";


print_r($final);

echo "\n\n-----desired::---\n\n";


print_r($desired);


查看完整回答
反对 回复 2022-11-04
?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

芦苇,


谢谢你这对我有用..但我从你的代码中得到启发并开始改进它。对于其他需要这样的人:


    function conf_get($paths, $array) {

        $paths = !is_array($paths) ? [] : $paths;

        foreach ($paths as $path)

            $array = $array[$path];

        return $array;

    }

    function conf_set($paths, $value, $array) {

        $array = !is_array($array) ? [] : $paths; // Initialize array if $array not set

        $result = &$array;

        foreach ($paths as $i => $path) {

            if ($i < count($paths) - 1) {

                if (!isset($result[$path]))

                    $result[$path] = [];

                $result = &$result[$path];

            } else

                $result[$path] = $value;

        }

        return $result;

    }


    $config = [];

    $config ['test']['me'] = ['test', 'me', 'now'];

    $config ['test']['me2'] = ['test', 'me', 'now'];


echo "\n INITIAL CONFIG"; 

print_r($config );

echo "\n GET PATH test"; 

print_r(conf_get('test', $config));

echo "\n GET PATH test,me1" ;

print_r(conf_get(['test', 'me2'], $config);

echo "\n REPLACE PATH test,me2 with new array" ;

print_r(conf_set(['test', 'me2'], ['name' => 'firstname', 'last' => 'lastname'], $config), "");

echo "\n ADD PATH test,me6 with new array";

print_r(conf_set(['test', 'me6'], ['name' => 'firstname', 'last' => 'lastname'], $config));

结果:



[INITIAL CONFIG]

    [test] => Array

            [me] => Array

                    [0] => test

                    [1] => me

                    [2] => now

            [me2] => Array

                    [0] => test

                    [1] => me

                    [2] => now


[GET PATH test]

    [test] => Array

            [me] => Array

                    [0] => test

                    [1] => me

                    [2] => now

            [me2] => Array

                    [0] => test

                    [1] => me

                    [2] => now


[GET PATH test,me1]

    [0] => test

    [1] => me

    [2] => now


[REPLACE PATH test,me2 with new array]

    [me2] => Array

            [name] => firstname

            [last] => lastname


[ADD PATH test,me6 with new array]

    [me6] => Array

            [name] => firstname

            [last] => lastname


查看完整回答
反对 回复 2022-11-04
  • 2 回答
  • 0 关注
  • 106 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信