使用已知的父键将静态关联元素推入已知级别的所有子数组中

问题描述 投票:0回答:4

我有一个动态生成的PHP多维数组如下:

Array (
    [uid_1] => Array (
        [sub_1] => Array (
            [sub_sub_1] => Array (
                [id1] => "val_1",
                [id2] => "val_2"
            )
        )
        [sub_2] => Array (
            [sub_sub_1] => Array (
                [id1] => "val_1",
                [id2] => "val_2"
            ),
            [sub_sub_2] => Array (
                [id3] => "val_3",
                [id4] => "val_4"
            )
        )
    )
)

数组要大得多,将包含多个 [uid]、[sub] 和 [sub_sub]。
请注意,虽然 [uid] 和 [sub] 是唯一的,但 [sub_sub] 不是唯一的。

是否可以在不使用循环且不知道 [uid_1] 和 [sub_2] 值的情况下将 [id5] => "val_5" 添加到 [sub_sub_1] 的所有实例?

php multidimensional-array associative-array
4个回答
2
投票

尝试以下代码。

<?php
$mainArray = array(
    "uid_1" => array(
        "sub_1" => array(
            "sub_sub_1" => array(
                "id1" => "val_1",
                "id2" => "val_2"
            )
        ),
        "sub_2" => array(
            "sub_sub_1" => array(
                "id1" => "val_1",
                "id2" => "val_2"
            ),
            "sub_sub_2" => array(
                "id3" => "val_3",
                "id4" => "val_4"
            )
        )
    )
);

echo "<pre>";
print_r($mainArray);
echo "</pre>";

foreach ($mainArray["uid_1"] as $key => $val) {

    // Check if 'sub_sub_1' exists before trying to access it
    if (isset($mainArray["uid_1"][$key]['sub_sub_1'])) {
        // Get array with index 'sub_sub_1' & Assign a New Value with key `id5`.
        $mainArray["uid_1"][$key]['sub_sub_1']["id5"] = "val_5";
    }
}

echo "<pre>";
print_r($mainArray);
echo "</pre>";
?>

1
投票
$array = [
  'uid_1' => [
    'sub_1' => [
      'sub_sub_1' => [ 'id1' => 'val_1', 'id2' => 'val_2' ]
    ],
    'sub_2' => [
      'sub_sub_1' => [ 'id1' => 'val_1', 'id2' => 'val_2' ],
      'sub_sub_2' => [ 'id3' => 'val_3', 'id4' => 'val_4' ]
    ]
  ],
  'uid_2' => [
    'sub_1' => [
      'sub_sub_1' => [ 'id1' => 'val_1', 'id3' => 'val_3' ]
    ],
  ]
];

$iterator = new RecursiveIteratorIterator(
  new RecursiveArrayIterator($array),
  RecursiveIteratorIterator::SELF_FIRST
);
$iterator->setMaxDepth(2);

while ($it->valid()) {
  if ($it->key() === 'sub_sub_1') {
    $array[$it->getSubIterator(0)->key()][$it->getSubIterator(1)->key()]['sub_sub_1']['id5'] = 'val_5';
  }
  $it->next();
}

print_r($array);

输出:

Array
(
    [uid_1] => Array
        (
            [sub_1] => Array
                (
                    [sub_sub_1] => Array
                        (
                            [id1] => val_1
                            [id2] => val_2
                            [id5] => val_5
                        )

                )

            [sub_2] => Array
                (
                    [sub_sub_1] => Array
                        (
                            [id1] => val_1
                            [id2] => val_2
                            [id5] => val_5
                        )

                    [sub_sub_2] => Array
                        (
                            [id3] => val_3
                            [id4] => val_4
                        )

                )

        )

    [uid_2] => Array
        (
            [sub_1] => Array
                (
                    [sub_sub_1] => Array
                        (
                            [id1] => val_1
                            [id3] => val_3
                            [id5] => val_5
                        )

                )

        )

)

备注:

RecursiveArrayIterator
访问数组的每个顶部节点。
RecursiveIteratorIterator
包装
RecursiveArrayIterator
并将访问数组的每个节点,而不仅仅是顶部节点。并且
setMaxDepth
确保我们不会浪费时间访问深度超过三层的节点。

我们迭代,检查键是否为“sub_sub_1”,如果为真,我们通过

getSubIterator->key
调用获取父路径部分。然后我们只需创建键并分配值即可。


0
投票

既然你提到了数组要大得多,可能需要循环。

    <?php
    $mainArray = array (
        "uid_1" => array (
            "sub_1" => array (
                "sub_sub_1" => array (
                    "id1" => "val_1",
                    "id2" => "val_2"
                )
                ),
            "sub_2" => array (
                "sub_sub_1" => array (
                    "id1" => "val_1",
                    "id2" => "val_2"
                ),
                "sub_sub_2" => array (
                    "id3" => "val_3",
                    "id4" => "val_4"
                )
            )
        )
    );

    echo "<pre>";
    print_r( $mainArray );
    echo "</pre>";



    foreach($mainArray["uid_1"] as $key=>$val){
        
        //$val (Arrays with index 'sub_1', 'sub_2' etc.)
        //Get array with index 'sub_sub_1' & Assign a New Value with key `id5`.

        $mainArray["uid_1"][$key]['sub_sub_1']["id5"] = "val_5";


    }

    echo "<pre>";
    print_r( $mainArray );
    echo "</pre>";
    ?>

0
投票

不要费心去尝试使简单的任务变得更加复杂。使用函数进行迭代可能会花费更长的时间并且更难理解。

使用两个嵌套循环,通过引用修改数据集,并无条件地将所需的关联元素推送到需要的位置。

即使数据集(子数组)没有

sub_sub_1
级别,此脚本也会创建级别并安全地将所需元素推入其中。如果这不是所需的行为,那么您应该提供更具代表性的示例输入数组并表达应如何处理这种边缘情况。

代码:(演示

foreach ($array as &$uids) {
    foreach ($uids as &$subs) {
        $subs['sub_sub_1']['id5'] = 'val_5';
    }
}
var_export($array);

输出:

array (
  'uid_1' => 
  array (
    'sub_1' => 
    array (
      'sub_sub_1' => 
      array (
        'id1' => 'val_1',
        'id2' => 'val_2',
        'id5' => 'val_5',
      ),
    ),
    'sub_2' => 
    array (
      'sub_sub_1' => 
      array (
        'id1' => 'val_1',
        'id2' => 'val_2',
        'id5' => 'val_5',
      ),
      'sub_sub_2' => 
      array (
        'id3' => 'val_3',
        'id4' => 'val_4',
      ),
    ),
  ),
  'uid_2' => 
  array (
    'sub_1' => 
    array (
      'sub_sub_1' => 
      array (
        'id1' => 'val_1',
        'id3' => 'val_3',
        'id5' => 'val_5',
      ),
    ),
  ),
)
© www.soinside.com 2019 - 2024. All rights reserved.