0

I have here a nested multidimensional array:

Array
(
[merchant] => Array
    (
        [XML_Serializer_Tag] => Array
            (
                [id] => 736
                [name] => Cadbury Gifts Direct
            )

        [prod] => Array
            (
                [XML_Serializer_Tag] => Array
                    (
                        [0] => Array
                            (
                                [XML_Serializer_Tag] => Array
                                    (
                                        [id] => 88966064
                                        [pre_order] => no
                                        [web_offer] => no
                                        [in_stock] => no
                                        [stock_quantity] => 0
                                    )

                                [pId] => 608
                                [isbn] => 0000000000000
                                [text] => Array
                                    (
                                        [name] => 50% OFF 56g Creme Egg Minis
                                        [desc] => 50% OFF Creme Egg Minis in a 56g bag.
                                    )

                                [uri] => Array
                                    (
                                        [awTrack] => http://www.awin1.com/pclick.php?p=88966064&a=67702&m=736
                                        [awThumb] => http://images.productserve.com/thumb/736/88966064.jpg
                                        [awImage] => http://images.productserve.com/preview/736/88966064.jpg
                                        [mLink] => http://www.cadburygiftsdirect.co.uk/products/608-50-off-56g-creme-egg-minis.aspx
                                        [mImage] => http://www.cadburygiftsdirect.co.uk/images/thumbs/0001084.png
                                    )

                                [price] => Array
                                    (
                                        [XML_Serializer_Tag] => Array
                                            (
                                                [curr] => GBP
                                            )

                                        [buynow] => 0.31
                                        [store] => 0.00
                                        [rrp] => 0.00
                                        [delivery] => 0.00
                                    )

                                [cat] => Array
                                    (
                                        [awCatId] => 437
                                        [awCat] => Chocolate
                                        [mCat] => Full Range
                                    )

                                [brand] => 
                                [valFrom] => 0000-00-00
                                [valTo] => 0000-00-00
                                [comAmount] => 0.00
                            )

The segment loop afterwards.

So...

[1] => Array
[2] => Array
[3] => Array

etc...

I need to find the names of the attributes of each array segment.

So I have used this recursive loop:

private function recursive_array($old_array, $new_array = array()) {

    foreach ($old_array as $key => $value) {

        if (is_array($value) && $key < 1) {
            $new_array = $this->recursive_array($value, $new_array);

        } else {
            if ($key < 1) {
                $new_array[] = $key;

            }
        }
    }
    return $new_array;
}

This is the output:

array
  0 => string 'id' (length=2)
  1 => string 'name' (length=4)
  2 => string 'id' (length=2)
  3 => string 'pre_order' (length=9)
  4 => string 'web_offer' (length=9)
  5 => string 'in_stock' (length=8)
  6 => string 'stock_quantity' (length=14)
  7 => string 'pId' (length=3)
  8 => string 'isbn' (length=4)
  9 => string 'name' (length=4)
  10 => string 'desc' (length=4)
  11 => string 'awTrack' (length=7)
  12 => string 'awThumb' (length=7)
  13 => string 'awImage' (length=7)
  14 => string 'mLink' (length=5)
  15 => string 'mImage' (length=6)
  16 => string 'curr' (length=4)
  17 => string 'buynow' (length=6)
  18 => string 'store' (length=5)
  19 => string 'rrp' (length=3)
  20 => string 'delivery' (length=8)
  21 => string 'awCatId' (length=7)
  22 => string 'awCat' (length=5)
  23 => string 'mCat' (length=4)
  24 => string 'brand' (length=5)
  25 => string 'valFrom' (length=7)
  26 => string 'valTo' (length=5)
  27 => string 'comAmount' (length=9

What it is also picking up is the top nested array:

[XML_Serializer_Tag] => Array
            (
                [id] => 736
                [name] => Cadbury Gifts Direct
            )

This is just details for the entire feed not the individual segments.

I need a way of filtering out the top nested array but bear in mind that the details are dynamic so the name of the keys can change from one feed to the next

2 Answers 2

2

Maybe this?

$riter = new RecursiveIteratorIterator(New RecursiveArrayIterator($array));
foreach ($riter as $key => $val) {
    if ($riter->getDepth() > 1) {
        echo "$key => $val\n";
    }
}

by default, RecursiveIteratorIterator only visits leaf nodes(the deepest levels down every path). getDepth() can be used to make sure were a minimum depth. I'm not sure if 1 is the correct number, but anyway...

Sign up to request clarification or add additional context in comments.

1 Comment

Yes, if I set it to level two is does work on all the different types of arrays. I need to re-write my function above now because by using this method it removes the key which I was using to count (this outputs a long list of strings)
0

use array_shift to pop off the first element of the array

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.