从字符串中追加到数组中

4
我是一个有用的助手,可以为您翻译文本。

我有一个名为$data的数组,需要从ajax调用中更新数据。

通过ajax调用发送了两个变量(具有示例输入):

sectionDetails:

[111][0][2][0][service_providers][]

服务提供商。
Google

serviceProvider是数据,sectionDetails是数组,其中serviceProvider应该在$data数组中。

我需要的是$data数组最终为:

$data  =   Array
(
[111] => Array
    (
        [0] => Array
            (
                [2] => Array
                    (
                        [0] => Array
                            (
                                [service_providers] => Array 
                                                    (
                                                        [0] = Google
                                                    )
                            )

                    )

            )

    )

)

这样,我就可以动态地输入数据到任何单元格中,并稍后更新特定的数组(例如$data [111] [0] [2] [0] [service_providers] [0] = "Yahoo";)。
然而,$_POST['sectionDetails'] 是一个字符串,这就是问题所在。
有没有办法将此字符串更改为数组,然后将其附加到主要的 $data 数组中(在同一部分存在值的情况下,更新该值)?
希望这样说得清楚。

1
“$_POST['sectionDetails']是一个字符串”,那么这个字符串具体包含什么? - dave
@dave '[111][0][2][0][service_providers][]' 我认为 - al'ein
1
@AlanMachado,这不是 PHP 数组的使用方法。你可以使用索引 111 来创建一个只有单个元素的数组。 - dave
这个问题有点类似于“如何使用字符串作为数组索引路径来检索值?”( https://dev59.com/iHI-5IYBdhLWcg3wxrqQ/ )。 - anubina
@dave,Alan是正确的;该字符串为[111][0][2][0][service_providers][]。 - Rehan Aslam
显示剩余3条评论
2个回答

3

If you create a function like this:

function setToPath(&$data, $path, $value){
    //$temp will take us deeper into the nested path
    $temp = &$data;

    //notice this preg_split logic is specific to your path syntax
    $exploded = preg_split("/\]\[/", rtrim(ltrim($path,"["),"]")); 

    // Where $path = '[111][0][2][0][service_providers][]';
    // $exploded = 
    //    Array
    //    (
    //        [0] => 111
    //        [1] => 0
    //        [2] => 2
    //        [3] => 0
    //        [4] => service_providers
    //        [5] => 
    //    )
    foreach($exploded as $key) {
        if ($key != null) {
            $temp = &$temp[$key];
        } else if(!is_array($temp)) {
            //if there's no key, i.e. '[]' create a new array
            $temp = array();
        }
    }
    //if the last index was '[]', this means push into the array
    if($key == null) {
        array_push($temp,$value);
    } else {
        $temp = $value;
    }
    unset($temp);
}

您可以像这样使用它:
setToPath($data, $_POST['sectionDetails'], $_POST['serviceProvider']);

print_r($data)将返回:

Array
(
    [111] => Array
        (
            [0] => Array
                (
                    [2] => Array
                        (
                            [0] => Array
                                (
                                    [service_providers] => Array
                                        (
                                            [0] => Google
                                        )

                                )

                        )

                )

        )

)

太棒了!你能给你的代码加点注释吗?(那个有函数的) - al'ein
@AlanMachado 希望这有所帮助 :) 如果您同意,请点赞! - anubina
快了!由于添加了2个条目,返回的数组如下:Array ( [0] => Array ( [0] => Array ( [339] => Array ( [0] => Array ( [2] => Array ( [0] => Array ( [service_providers] => 测试2 ) ) ) ) ) [339] => Array ( [0] => Array ( [2] => Array ( [0] => Array ( [service_providers] => 测试3 ) ) ) ) ) ) - Rehan Aslam
忽略最后一条评论。经过测试,似乎每次更新时整个数组被推送的问题并不是由您提供的函数引起的。感谢您的帮助! - Rehan Aslam
@RehanAslam :) 很高兴我能帮到你! - anubina

1

在非常谨慎并根据情况的情况下,您可以使用eval

eval("\$data$sectionDetails = '$serviceProvider';");

"

print_r($data)会返回:

"
Array
(
    [111] => Array
        (
            [0] => Array
                (
                    [2] => Array
                        (
                            [0] => Array
                                (
                                    [service_providers] => Array
                                        (
                                            [0] => Google
                                        )

                                )

                        )

                )

        )

)

注意 eval()语言结构非常危险,因为它允许执行任意的PHP代码。因此,不建议使用它。如果您仔细验证后发现没有其他选择,一定要特别注意,在没有适当验证之前不要将任何用户提供的数据传递给它。


做了一个快速测试,似乎这确实可以完成任务,但由于输入将来自各个用户,我宁愿避免使用eval()。感谢您的帮助! - Rehan Aslam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接