Nom
Nom

Reputation: 58

Parsing a Nested Array (PHP)

I am trying to find an efficient way to do the following :

1) Parse an array. 2) If the element is a single value, store it/echo it. 3) If the element is an array, Parse it and store/echo all of its elements.

An example would be :

$array = array(15,25,'Dog',[11,'Cat','Cookie15'],22)

This would be echo'd as :

15 25 Dog 11 Cat Cookie15 22

Note : The maximum number of Nested layers of Arrays = 2 (The max is an Array within an Array, not deeper than that).

The code I have made so far is :

foreach($_POST as $key=>$value){  
      if(is_array($value))
      {
      <Not sure how to handle this condition! Need to parse the array and echo individual elements>
      }
      else
      {
       echo "Input name : $key Value : $value  ";
      }
}

Edit: The following is my dump for the array. The nested elements show blank for some odd reason!

string '15' (length=2)

string '25' (length=2)

string 'Dog' (length=3)

array (size=3)
  0 => string '' (length=0)
  1 => string '' (length=0)
  2 => string '' (length=0)

string '22' (length=2)

The relevant code is :

foreach($_POST as $input) {
 var_dump($input);
}

Upvotes: 0

Views: 4398

Answers (3)

Edson Horacio Junior
Edson Horacio Junior

Reputation: 3143

This should do the trick

PS.: I edit the call to the function, i was calling it inside a foreach, now i'm just sending $_POST wich is correct.

Second edit: I'm not saving the function inside a variable anymore, instead i'm declaring it.

function recursiveEcho($input){
    if (is_array($input)) {
        foreach ($input as $key => $value) {
            if (is_array($value)) {
                recursiveEcho($value);
            } else {
                echo "Input name: {$key} Value: {$value}";
            }
        }
    } else {
        // This is a string, there is no key to show
        echo "Input value: {$input}";
    }
};

recursiveEcho($_POST);

Upvotes: 2

ComFreek
ComFreek

Reputation: 29424

Using a RecursiveIteratorIterator and a RecursiveArrayIterator is definitely the cleanest way:

$it = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr));

foreach ($it as $key => $value) {
    var_dump($key, $value);
}


This was my old solution:

function handle($arr, $deepness=1) {
  if ($deepness == 3) {
    exit('Not allowed');
  }

  foreach ($arr as $key => $value) {
    if (is_array($value)) {
      handle($value, ++$deepness);
    }

    else {
      echo "Input name: $key Value: $value ";
    }
  }
}

handle($_POST);

Upvotes: 3

Ryan
Ryan

Reputation: 14649

This will only handle 1 level. To handle x amount of levels, you either have to use a recursive function, or keep on nesting if statements.

foreach($_POST as $key => $value) {
   if(is_array($value) {
        foreach($value as $key2 => $value2) {
         echo "Key: " .  $key2 . "value: " .$value2;
        }
    } else {
        echo "key" .  $key . "value: ".  $value;
    }

}

Upvotes: 0

Related Questions