【问题标题】:Append to an array from a string从字符串追加到数组
【发布时间】:2015-10-01 16:36:47
【问题描述】:

我有一个名为 $data 的数组,需要使用来自 ajax 调用的数据进行更新。

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

部分详情

[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 数组(如果同一部分中存在现有值,则更新该值)?

希望这是有道理的。

【问题讨论】:

  • "$_POST['sectionDetails'] 然而是一个字符串" - 字符串到底包含什么?
  • @dave '[111][0][2][0][service_providers][]' 我认为
  • 将你的name属性改为sectionDetails[],它是一个数组。
  • 如果你想打电话给$data[111][0][2][0][service_providers][0] = "Yahoo";,你会意识到你将拥有一个实际的嵌套数组,第一个节点将有112个位置,对吧?如果之前的位置,在嵌套其他数组的 111º 之前,有空值,可以吗?
  • @AlanMachado 这不是 PHP 处理数组的方式,您可以拥有一个包含索引为 111 的单个元素的数组

标签: php arrays post


【解决方案1】:

如果你创建一个这样的函数:

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
                                        )

                                )

                        )

                )

        )

)

【讨论】:

  • 太棒了!你能评论一下你的代码吗? (有功能的)
  • @AlanMachado 希望对您有所帮助 :) 如果您同意,请点赞!
  • 快到了!由于某种原因,在添加 2 个整数后,返回的数组如下: Array ( [0] => Array ( [0] => Array ( [339] => Array ( [0] => Array ( [2] => Array ( [0] => Array ( [service_providers] => testing 2 ) ) ) ) [339] => Array ( [0] => Array ( [2] => Array ( [0] => Array ( [ service_providers] => 测试 3) ) ) ) ) )
  • 忽略最后一条评论。测试后,每次更新推送的整个数组似乎不是由于您提供的功能。感谢您的帮助!
  • @RehanAslam :) 很高兴我能帮上忙!
【解决方案2】:

非常小心,根据具体情况,您可以使用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()。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-05
  • 2015-08-20
  • 2019-08-07
相关资源
最近更新 更多