【问题标题】:PHP Append array in nested arrayPHP在嵌套数组中追加数组
【发布时间】:2018-01-31 04:39:56
【问题描述】:

我有下面的数组,我需要在$newData['_embedded']['settings']['web/vacation/filters']['data'] 中追加一个新数组,如何访问和追加它?

$newData  = [ 
  "id" => "47964173",
  "email" => "abced@gmail.com",
  "firstName" => "Muhammad",
  "lastName" => "Taqi",
  "type" => "employee",
  "_embedded" => [
      "settings" => [
    [
        "alias" => "web/essentials",
        "data" => [],
        "dateUpdated" => "2017-08-16T08:54:11Z"
    ],
    [
        "alias" => "web/personalization",
        "data" => [],
        "dateUpdated" => "2016-07-14T10:31:46Z"
    ],
    [
        "alias" => "wizard/login",
        "data" => [],
        "dateUpdated" => "2016-09-26T07:56:43Z"
    ],
    [
        "alias" => "web/vacation/filters",
        "data" => [
          "test" => [
            "type" => "teams",
            "value" => [
              0 => "09b285ec-7687-fc95-2630-82d321764ea7",
              1 => "0bf117b4-668b-a9da-72d4-66407be64a56",
              2 => "16f30bfb-060b-360f-168e-1ddff04ef5cd"
            ],
          ],
          "multiple teams" => [
            "type" => "teams",
            "value" => [
              0 => "359c0f53-c9c3-3f88-87e3-aa9ec2748313"
            ]
          ]
        ],
        "dateUpdated" => "2017-07-03T09:10:36Z"
      ],
    [
        "alias" => "web/vacation/state",
        "data" => [],
        "dateUpdated" => "2016-12-08T06:58:57Z"
    ]
    ]
  ]
];

$newData['_embedded']['settings']['web/vacation/filters']['data'] = $newArray;

任何快速附加它的提示,我不想循环并检查循环内的键。

【问题讨论】:

标签: php arrays functional-programming php-7


【解决方案1】:

settings 子数组已“索引”。您首先需要在子数组的alias 列中搜索web/vacation/filters 以找到正确的索引。使用没有break 的 foreach 循环将意味着即使找到索引后您的代码仍将继续迭代(不好的编码习惯)。

有一种更简洁的方法可以避免使用loop & condition & break,请使用array_search(array_column())。它会寻找你的关联元素,返回索引,然后立即停止寻找。

您可以使用+ 运算符将新数据添加到子数组中。这样可以避免调用像 array_merge() 这样的函数。

代码:(Demo)

if(($index=array_search('web/vacation/filters',array_column($newData['_embedded']['settings'],'alias')))!==false){
    $newData['_embedded']['settings'][$index]['data']+=$newArray;
}
var_export($newData);

也许更深思熟虑的过程是在搜索返回不匹配时强制插入新数据,而不是仅仅将该过程标记为不成功。您可能需要调整特定时区的日期生成或其他... (Demo Link)

$newArray=["test2"=>[
            "type" =>"teams2",
            "value" => [
              0 => "09b285ec-7687-fc95-2630-82d321764ea7",
              1 => "0bf117b4-668b-a9da-72d4-66407be64a56",
              2 => "16f30bfb-060b-360f-168e-1ddff04ef5cd"
            ],
          ]
          ];
if(($index=array_search('web/vacation/filters',array_column($newData['_embedded']['settings'],'alias')))!==false){
    //echo $index;
    $newData['_embedded']['settings'][$index]['data']+=$newArray;
}else{
    //echo "couldn't find index, inserting new subarray";
    $dt = new DateTime();
    $dt->setTimeZone(new DateTimeZone('UTC'));  // or whatever you are using
    $stamp=$dt->format('Y-m-d\TH-i-s\Z');

    $newData['_embedded']['settings'][]=[
                                            "alias" => "web/vacation/filters",
                                            "data" => $newArray,
                                            "dateUpdated" => $stamp
                                        ];
}

【讨论】:

  • @mtaqi 这是你“应该”这样做的方式。 jh1711 的答案中的 foreach 循环不包括退出,因此即使在成功添加新数据后它也会继续迭代。我的方式也避免了数组合并的调用。
  • 我想我们应该补充一点,我的循环返回别名最后一次出现的索引,而您的 array_search 返回第一个。也许我们还可以提到 array_merge 用相同的索引替换值,而联合运算符没有。但是每个人总是想要先和旧,而不是最后和新,或者上帝禁止组合。
  • OP 的输入数据并没有暗示会有多个匹配,所以搜索多个匹配没有任何好处。如果我们要讨论问题的理论扩展,那么我应该注意,如果找不到目标子数组,您的方法将生成:<b>Notice</b>: Undefined variable: indexOfWVF 并插入一个非索引子数组(键是空字符串)。
  • 触摸。 array_merge 和联合运算符之间的区别,仍然有人感兴趣。但我承认这只是一个边缘案例。
【解决方案2】:

您需要找到与 web/vacation/filters 对应的键。例如,您可以使用它。

foreach ($newData['_embedded']['settings'] as $key => $value) {
 if ($value["alias"]==='web/vacation/filters') {
   $indexOfWVF = $key;
 }
}
$newData['_embedded']['settings'][$indexOfWVF]['data'][] = $newArray;

来自 cmets。然后你想merge 数组。不要附加它们。

$newData['_embedded']['settings'][$indexOfWVF]['data'] = array_merge($newData['_embedded']['settings'][$indexOfWVF]['data'],$newArray);

或者(如果它总是 Filter1):

  $newData['_embedded']['settings'][$indexOfWVF]['data']['Filter1'] = $newArray['Filter1'];

【讨论】:

  • 现在变成了 ``` "alias" => "web/vacation/filters" "data" => [ "test" => [] "multiple teams" => [] 0 = > [“过滤器1”=> []]]```
  • Filter1 是新数组。它应该是 ` "alias" => "web/vacation/filters" "data" => [ "test" => [] "multiple teams" => [] "Filter1" => [] ]`
  • 很好的例子。或者,使数组结构适合您。
  • @mtaqi。我用 2 条应该可行的建议编辑了答案。你需要为他们两个都保留 for 循环
猜你喜欢
  • 1970-01-01
  • 2013-06-17
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
相关资源
最近更新 更多