PHP在嵌套数组中追加数组

时间:2017-08-22 19:15:43

标签: php arrays functional-programming php-7

我有下面的数组,我需要在$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;

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

2 个答案:

答案 0 :(得分:1)

您需要找到与网络/假期/过滤器对应的密钥。例如,你可以使用它。

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

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

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

或(如果它总是Filter1):

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

答案 1 :(得分: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
                                        ];
}