在嵌套数组-PHP中替换值

发布于 2025-02-12 22:12:56 字数 2773 浏览 0 评论 0原文

我是新手的stackoverflow。我有一个问题。该代码如何更适合嵌套数组中的价值更换?

例如,我从JSON文件中获得此数组:

$json_file = "template.json";
$json = file_get_contents($json_file);
$array = json_decode($json, true);

现在,我获得包含某些搜索值的数组$ res:

function array_recursive_search_key_map($needle, $haystack) {
    foreach($haystack as $first_level_key=>$value) {
        if ($needle === $value) {
            return array($first_level_key);
        } elseif (is_array($value)) {
            $callback = array_recursive_search_key_map($needle, $value);
            if ($callback) {
                return array_merge(array($first_level_key), $callback);
            }
        }
    }
    return false;
}

$res = array_recursive_search_key_map("id|logo", $array);

执行此操作,$ res包含嵌套$ array中搜索值的位置:

$res = ["content",0,"elements",0,"elements",0,"elements",0,"elements",0,"settings","_attributes"]

我想替换progamationally prog上的值在:

$array["content"][0]["elements"][0]["elements"][0]["elements"][0]["elements"][0]["settings"]["_attributes"] = "some new value";

我创建了一个新功能,但我认为不是很实际:

function recursive_replacement($keymap, $newvalue)
{
    $size = sizeof($keymap);
    switch ($size)
    {
        case 1:
            $array[$keymap[0]] = $newvalue;
            break;
        case 2:
            $array[$keymap[0]][$keymap[1]] = $newvalue;
            break;
        case 3:
            $array[$keymap[0]][$keymap[1]][$keymap[2]] = $newvalue;
            break;
        case 4:
            $array[$keymap[0]][$keymap[1]][$keymap[2]][$keymap[3]] = $newvalue;
            break;
        case 5:
            $array[$keymap[0]][$keymap[1]][$keymap[2]][$keymap[3]][$keymap[4]] = $newvalue;
            break;
        case 6:
            $array[$keymap[0]][$keymap[1]][$keymap[2]][$keymap[3]][$keymap[4]][$keymap[5]] = $newvalue;
            break;
        case 7:
            $array[$keymap[0]][$keymap[1]][$keymap[2]][$keymap[3]][$keymap[4]][$keymap[5]][$keymap[6]]  = $newvalue;
            break;
        case 8:
            $array[$keymap[0]][$keymap[1]][$keymap[2]][$keymap[3]][$keymap[4]][$keymap[5]][$keymap[6]][$keymap[7]]  = $newvalue;
            break;
        case 9:
            $array[$keymap[0]][$keymap[1]][$keymap[2]][$keymap[3]][$keymap[4]][$keymap[5]][$keymap[6]][$keymap[7]][$keymap[8]]  = $newvalue;
            break;
        case 10:
            $array[$keymap[0]][$keymap[1]][$keymap[2]][$keymap[3]][$keymap[4]][$keymap[5]][$keymap[6]][$keymap[7]][$keymap[8]][$keymap[9]]   = $newvalue;
            break;
    }
    return $array;
}

使用方式:

$new_array = recursive_replacement($res, "some new value");

任何建议都将不胜感激。谢谢!

i am new on stackoverflow. I have a question. How do this code more appropiate for value replacement in nested arrays?

For example, i have this array obtained from json file:

$json_file = "template.json";
$json = file_get_contents($json_file);
$array = json_decode($json, true);

Now, i obtain the array $res that contain certain searched value:

function array_recursive_search_key_map($needle, $haystack) {
    foreach($haystack as $first_level_key=>$value) {
        if ($needle === $value) {
            return array($first_level_key);
        } elseif (is_array($value)) {
            $callback = array_recursive_search_key_map($needle, $value);
            if ($callback) {
                return array_merge(array($first_level_key), $callback);
            }
        }
    }
    return false;
}

$res = array_recursive_search_key_map("id|logo", $array);

Doing this, $res contains the position of the searched value in nested $array:

$res = ["content",0,"elements",0,"elements",0,"elements",0,"elements",0,"settings","_attributes"]

I want to replace progamatically the value in:

$array["content"][0]["elements"][0]["elements"][0]["elements"][0]["elements"][0]["settings"]["_attributes"] = "some new value";

I was created a new function but i think are not very practically:

function recursive_replacement($keymap, $newvalue)
{
    $size = sizeof($keymap);
    switch ($size)
    {
        case 1:
            $array[$keymap[0]] = $newvalue;
            break;
        case 2:
            $array[$keymap[0]][$keymap[1]] = $newvalue;
            break;
        case 3:
            $array[$keymap[0]][$keymap[1]][$keymap[2]] = $newvalue;
            break;
        case 4:
            $array[$keymap[0]][$keymap[1]][$keymap[2]][$keymap[3]] = $newvalue;
            break;
        case 5:
            $array[$keymap[0]][$keymap[1]][$keymap[2]][$keymap[3]][$keymap[4]] = $newvalue;
            break;
        case 6:
            $array[$keymap[0]][$keymap[1]][$keymap[2]][$keymap[3]][$keymap[4]][$keymap[5]] = $newvalue;
            break;
        case 7:
            $array[$keymap[0]][$keymap[1]][$keymap[2]][$keymap[3]][$keymap[4]][$keymap[5]][$keymap[6]]  = $newvalue;
            break;
        case 8:
            $array[$keymap[0]][$keymap[1]][$keymap[2]][$keymap[3]][$keymap[4]][$keymap[5]][$keymap[6]][$keymap[7]]  = $newvalue;
            break;
        case 9:
            $array[$keymap[0]][$keymap[1]][$keymap[2]][$keymap[3]][$keymap[4]][$keymap[5]][$keymap[6]][$keymap[7]][$keymap[8]]  = $newvalue;
            break;
        case 10:
            $array[$keymap[0]][$keymap[1]][$keymap[2]][$keymap[3]][$keymap[4]][$keymap[5]][$keymap[6]][$keymap[7]][$keymap[8]][$keymap[9]]   = $newvalue;
            break;
    }
    return $array;
}

And the use way:

$new_array = recursive_replacement($res, "some new value");

Any suggestion would be appreciated. Thanks!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

短叹 2025-02-19 22:12:56

在第一步,我们需要一个符号来解决数组中的项目,我喜欢点表示法,

$array = [
    'item_1' => [
        'item_2' => 1,
        'item_3' => [
            'item_4',
            'item_5'
        ]
    ]
];

例如'item_1.item_3.0'而不是$ array ['item_1'] ['item_3'] [0]

现在我们需要在我们的地址密钥上迭代并找到目标元素,

function  replaceArrayItem($searchKey, $replacement, $array) {
    $itemAddressBlocks = explode('.', $searchKey); // convert to array so we can iterate on address
    
    $replacedArray = $array;
    $temp = &$replacedArray; // pass by reference

    foreach($itemAddressBlocks as $depth => $index) {
        if( $depth < sizeof($itemAddressBlocks) - 1 ) {  // rolling in the deep :)
            $temp = &$temp[$index];  
            continue;
        }
        
        $temp[$index] = $replacement;  // last step and replacement
    }
    
    return $replacedArray;
}

现在让我们测试我们的新功能,


/**
Array
(
    [item_1] => ***replacedItem***
)
**/
print_r( replaceArrayItem('item_1', 'replacedItem', $array) );

/**
Array
(
    [item_1] => Array
        (
            [item_2] => ***replacedItem***
            [item_3] => Array
                (
                    [0] => item_4
                    [1] => item_5
                )

        )

)
**/
print_r( replaceArrayItem('item_1.item_2', 'replacedItem', $array) );


/**
Array
(
    [item_1] => Array
        (
            [item_2] => 1
            [item_3] => Array
                (
                    [0] => item_4
                    [1] => ***replacedItem***
                )

        )

)


**/
print_r( replaceArrayItem('item_1.item_3.1', 'replacedItem', $array) );



现在可以进行前进

$itemAddress = 'content.0';
for($i =0; $i < 4; $i++) {
    $itemAddress .= '.elements.0';
}
$itemAddress .= '.settings._attributes';

replaceArrayItem($itemAddress, $yourValue, $array);

At the very first step we need a notation to address an item in an array, i like the dot notation

$array = [
    'item_1' => [
        'item_2' => 1,
        'item_3' => [
            'item_4',
            'item_5'
        ]
    ]
];

For example 'item_1.item_3.0' instead of $array['item_1']['item_3'][0]

Now we need to iterate on our address key and find destination element

function  replaceArrayItem($searchKey, $replacement, $array) {
    $itemAddressBlocks = explode('.', $searchKey); // convert to array so we can iterate on address
    
    $replacedArray = $array;
    $temp = &$replacedArray; // pass by reference

    foreach($itemAddressBlocks as $depth => $index) {
        if( $depth < sizeof($itemAddressBlocks) - 1 ) {  // rolling in the deep :)
            $temp = &$temp[$index];  
            continue;
        }
        
        $temp[$index] = $replacement;  // last step and replacement
    }
    
    return $replacedArray;
}

Now lets test our new function


/**
Array
(
    [item_1] => ***replacedItem***
)
**/
print_r( replaceArrayItem('item_1', 'replacedItem', $array) );

/**
Array
(
    [item_1] => Array
        (
            [item_2] => ***replacedItem***
            [item_3] => Array
                (
                    [0] => item_4
                    [1] => item_5
                )

        )

)
**/
print_r( replaceArrayItem('item_1.item_2', 'replacedItem', $array) );


/**
Array
(
    [item_1] => Array
        (
            [item_2] => 1
            [item_3] => Array
                (
                    [0] => item_4
                    [1] => ***replacedItem***
                )

        )

)


**/
print_r( replaceArrayItem('item_1.item_3.1', 'replacedItem', $array) );



Now You can progamatically

$itemAddress = 'content.0';
for($i =0; $i < 4; $i++) {
    $itemAddress .= '.elements.0';
}
$itemAddress .= '.settings._attributes';

replaceArrayItem($itemAddress, $yourValue, $array);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文