skip to Main Content

I have a dynamically generated PHP multi-dimensional array as follows:

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"
            )
        )
    )
)

The array is much bigger and will contain multiple [uid], [sub] and [sub_sub].
Note that while [uid] and [sub] are unique, [sub_sub] are not.

Is it possible to add [id5] => "val_5" to all instances of [sub_sub_1] without using loops and without knowing the value of [uid_1] and [sub_2]?

3

Answers


  1. Since You mentioned The array is much bigger, Loop may be needed.

        <?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>";
        ?>
    
    Login or Signup to reply.
  2. Try the following code.

    <?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>";
    ?>
    
    Login or Signup to reply.
  3. $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);
    

    Output:

    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
                            )
    
                    )
    
            )
    
    )
    

    Notes:

    The RecursiveArrayIterator visits every top node of the array. The RecursiveIteratorIterator wraps the RecursiveArrayIterator and will visit every node of the array, not just the top nodes. And setMaxDepth makes sure we do not waste time visiting nodes more than three level deep.

    We iterate, check for the key being ‘sub_sub_1’, and if true, we grab the parent path parts getSubIterator->key. And then we just create the key and assign the value.

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search