29

i have a multidimensional array:

$image_path = array('sm'=>$sm,'lg'=>$lg,'secondary'=>$sec_image);

witch looks like this:

[_media_path:protected] => Array
            (
                [main_thumb] => http://example.com/e4150.jpg
                [main_large] => http://example.com/e4150.jpg
                [secondary] => Array
                    (
                        [0] => http://example.com/e4150.jpg
                        [1] => http://example.com/e4150.jpg
                        [2] => http://example.com/e9243.jpg
                        [3] => http://example.com/e9244.jpg
                    )

            )

and i would like to convert it into an object and retain the key names.

Any ideas?

Thanks

edit: $obj = (object)$image_path; doesn't seem to work. i need a different way of looping through the array and creating a object

2
  • can you give us a better example of what you want the object to look like? do you want to turn the keys into properties? for what purpose do you need an object? Commented Feb 7, 2012 at 1:38
  • instead of using [] to get the value i need to use -> Commented Feb 7, 2012 at 1:42

2 Answers 2

126

A quick way to do this is:

$obj = json_decode(json_encode($array));

Explanation

json_encode($array) will convert the entire multi-dimensional array to a JSON string. (php.net/json_encode)

json_decode($string) will convert the JSON string to a stdClass object. If you pass in TRUE as a second argument to json_decode, you'll get an associative array back. (php.net/json_decode)

I don't think the performance here vs recursively going through the array and converting everything is very noticeable, although I'd like to see some benchmarks of this. It works, and it's not going to go away.

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

10 Comments

This should be the answer, since the OP wants the whole multidimensional array, not the top-level array.
I would say that this is a slow way to do it. If performance is a concern, I would avoid this solution.
@CalebTaylor – I hear ya. I'm not sure of the benchmarks, but am curious if there is a non-trivial difference between recursively iterating over a multi-dimensional array and adding to an object (i.e. doing this entire thing by hand) or simply running the above JSON trick.
I actually benchmarked this code with php 7.2 -> json_decode is 5 times faster than array_map or other recursive operations. Also in php 5.4 the json_decode solution is the fastest option I could find. Great answer!
@Mirceac21 your object can implement JsonSerializable to define how it's converted.
|
7

The best way would be to manage your data structure as an object from the start if you have the ability:

$a = (object) array( ... ); $a->prop = $value; //and so on

But the quickest way would be the approach supplied by @CharlieS, using json_decode(json_encode($a)).

You could also run the array through a recursive function to accomplish the same. I have not benchmarked this against the json approach but:

function convert_array_to_obj_recursive($a) {
    if (is_array($a) ) {
        foreach($a as $k => $v) {
            if (is_integer($k)) {
                // only need this if you want to keep the array indexes separate
                // from the object notation: eg. $o->{1}
                $a['index'][$k] = convert_array_to_obj_recursive($v);
            }
            else {
                $a[$k] = convert_array_to_obj_recursive($v);
            }
        }

        return (object) $a;
    }

    // else maintain the type of $a
    return $a; 
}

Hope that helps.

EDIT: json_encode + json_decode will create an object as desired. But, if the array was numerical or mixed indexes (eg. array('a', 'b', 'foo'=>'bar') ), you will not be able to reference the numerical indexes with object notation (eg. $o->1 or $o[1]). the above function places all the numerical indexes into the 'index' property, which is itself a numerical array. so, you would then be able to do $o->index[1]. This keeps the distinction of a converted array from a created object and leaves the option to merge objects that may have numerical properties.

2 Comments

Thanks for providing the recursive function, I think that's probably helpful to a lot of folks that stumble upon this. I'm going to check the PHP source code to see how json_encode/decode compares in terms of performance. I'm curious.
You can reference numerical properties on objects via $o->{1}.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.