【问题标题】:PHP - Recursively insert a key/value pair after a specific key in multidimensional arrayPHP - 在多维数组中的特定键之后递归插入键/值对
【发布时间】:2021-12-29 13:25:39
【问题描述】:

我有一个索引数组,其中包含任意数量的嵌套关联数组或索引数组。 如果每个数组包含一个键“香蕉”,我需要在每个数组中递归插入一个新的键/值对“苹果”。

$original = [
    0 => [
        'something1' => 'something',
        'banana' => 'yellow',
        'something2' => [
            'something3' => 'something',
            'something4' => [
                'something5' => 'something',
                'banana' => 'yellow',
                'something6' => [
                    'banana' => 'yellow',
                ]
            ],
            'banana' => 'yellow',
        ],
        'something7' => [
            0 => [
                'something8' => 'something',
                'banana' => 'yellow',
            ],
        ],
    ],
    1 => [
        'something9' => 'something',
        'banana' => 'yellow',
    ],
    2 => [
        'something10' => 'something',
    ],
];

这是预期的结果 - 'apple' 不必立即插入到 'banana' 旁边,它可以位于同一级别数组中的任何位置,只要它是 'banana' 的兄弟。

$new = [
    0 => [
        'something1' => 'something',
        'banana' => 'yellow',
        'apple' => 'red',
        'something2' => [
            'something3' => 'something',
            'something4' => [
                'something5' => 'something',
                'banana' => 'yellow',
                'apple' => 'red',
                'something6' => [
                    'banana' => 'yellow',
                    'apple' => 'red',
                ]
            ],
            'banana' => 'yellow',
            'apple' => 'red',
        ],
        'something7' => [
            0 => [
                'something8' => 'something',
                'banana' => 'yellow',
                'apple' => 'red',
            ],
        ],
    ],
    1 => [
        'something9' => 'something',
        'banana' => 'yellow',
        'apple' => 'red',
    ],
    2 => [
        'something10' => 'something',
    ],
];

我可以找到有关如何在平面数组中的某个键之后插入键/值对的答案,但找不到在多维数组中递归执行此操作的答案。

【问题讨论】:

  • 你的数组键在同一层重复!! BTW 这样操作的目的是什么?
  • 首先在创建数组之前进行插入不是有意义吗?
  • 该数组在PHP中通过json_decode()生成的数据库中存在JSON,以便可以对其进行操作,目标是然后json_encode() $new数组以替换原始数据分贝。

标签: php arrays multidimensional-array


【解决方案1】:
    $original = [
    0 => [
        'something1' => 'something',
        'banana' => 'yellow',
        'something2' => [
            'something1' => 'something',
            'something2' => [
                'something1' => 'something',
                'banana' => 'yellow',
                'something2' => [
                    'banana' => 'yellow',
                ]
            ],
            'banana' => 'yellow',
        ],
        'something3' => [
            0 => [
                'something' => 'something',
                'banana' => 'yellow',
            ],
        ],
    ],
    1 => [
        'something' => 'something',
        'banana2' => 'yellow',
    ],
];

function ins_value_to_arr(&$arr, $insVal = [] , $sibling = NULL){
    static  $ins; 
    static $sib;
    if($insVal){
        $ins = $insVal;
        $sib = $sibling;
    }
    $merge = false;
    foreach($arr as $k => &$val){
        if(is_array($val)){
           ins_value_to_arr($val); 
        }
        if($k == $sib){
            $merge = true;
        }
    }
    if($merge){
        $arr = array_merge($arr,$ins);
    }
    
    return $arr;
}

// call -> ins_value_to_arr($original,['apple' => 'red'],'banana');

【讨论】:

  • 这不起作用——它不会专门寻找键“banana”——因此即使在不包含“banana”的数组中也会插入“apple”。
  • 好的,只需稍作修改!
  • 我已经更新了答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多