1

I have a json_array - $json_array which is multi-level the code below "spits it" out correctly but is there a better way of doing it? What I will end up with is a structured XML document with the array keys as the element names - but they must be in the same format as the json array:

e.g.

[1] => stdClass Object ( 
    [content] => stdClass Object ( array ) 
    [general] => stdClass Object ( array ) 
    [costing] => stdClass Object ( array ) 
    [socialbits] => stdClass Object (array ) 
    [options] => stdClass Object ( (array) 
        ( [0] => stdClass Object ( array(array)  ) ) ) )

Where 1 is the main array key (actually the id from a database)

$json_array = json_encode($data);

foreach(json_decode($json_array) as $k=>$val) {

    foreach($val as $k1=>$v2){

        echo $k1;                
        echo '<br />';            
        foreach($v2 as $k3=>$v3){                
            echo $k3;                
            echo '<br />';                
            if(is_array($v3)){            
                foreach($v3 as $k4=>$v4){            
                    foreach($v4 as $k5=>$v5){                        
                        echo $k5;                            
                        echo '<br />';                                
                        foreach($v5 as $k6=>$v6){                                
                            echo $v6;                                
                            echo '<br />'
                        }           
                    }
                }
            }
            echo $v3;
        }
        echo '<br />';
    }
    echo '<br />';  
}
// } OP included the closing brace.

Thoughts and ideas most welcome thanks -

EDIT

I have no objection to edits of code, but for the sake of others please make sure they are accurate. This is a corrected form of the edit;

foreach(json_decode($json_array) as $k=>$val) {

foreach($val as $k1=>$v2){

    echo $k1;                
    echo '<br />';            
    foreach($v2 as $k3=>$v3){                
        echo $k3;                
        echo '<br />';                
        if(is_array($v3)){            
            foreach($v3 as $k4=>$v4){            
                foreach($v4 as $k5=>$v5){                        
                    echo $k5;                            
                    echo '<br />';                                
                        foreach($v5 as $k6=>$v6){                                
                            echo $v6;                                
                            echo '<br />';
                        }           
                }
            }
        } else {
        echo $v3;
        }
    }
    echo '<br />';
}
echo '<br />';  
}
9
  • 1
    I don't understand what your question is? Commented Aug 15, 2011 at 15:02
  • THe "main code" works, BUT is there not a better/cleaner way of writing it? Commented Aug 15, 2011 at 15:03
  • JSON is not XML. It's simply a method of representing a data structure using Javascript's code syntax. If you want a JSON string to decode into HTML, you'll have to massage the data yourself. Commented Aug 15, 2011 at 15:04
  • 1
    @Russel: use a recursive function. Your code is limited to a nesting depth of 6 layers Commented Aug 15, 2011 at 15:07
  • 1
    Why are you using html line breaks in an XML document? Commented Aug 15, 2011 at 15:22

1 Answer 1

1

I think this may help you achieve an xml representation of json which is what I assume you require from reading your question:

<?php
echo recurseJson2XML($json_array, true);
function recurseJson2XML($json, $root = false)
{
    $element = '';
    foreach($json as $key => $value)
    {
        if(is_numeric($key))
        {
            $key = 'element_' . $key;
        }
        $element .= "<{$key}>";
        if(is_array($value) || is_object($value))
        {
            $element .= recurseJson2XML($value);
        }
        else
        {
            $element .= $value;
        }
        $element .= "</{$key}>";
    }
    if($root)
    {
        $element = "<?xml version=\"1.0\" ?><root>{$element}</root>";
    }
    return $element;
}
?>

I tested to make sure it works on a json decoded string and it works... Let me know if you have any issues.

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

3 Comments

many thanks, no issues just had to quickly "strtolower(str_replace(' ','',$key))" the keys just in case element names are mis-formed (will not be me doing it Thanks and voted up ty.)
Matt - hit a slight problem / question - the very first numeric key in the foreach loop ie in very top code - [1] => stdClass Object (... I do not want to be tagged as element as it does in your function. I cannot seem to isolate it any suggestions? The reason is I want to add an attribute to the very first 'element' but not to child 'elements'
You could do this: echo recurseJson2XML($json_array[1], true);

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.