Skip to content
Advertisement

Order object properties based on values of an array

I have the following object:

'new_value' => 
    'name' => 'Teste',
    'key' => 'TESTE',
    'icon' => 'empty',

And the following array:

array(
   0 => 'name',
   1 => 'icon',
   2 => 'key',
)

However I would like to arrange the properties in the object based in the value of the array, so the result would be:

'new_value' => 
    'name' => 'Test',
    'icon' => 'empty',
    'key' => 'TEST', 

How can I achieve this? I couldn’t find anything on google related to this, only how to sort an array of objects.

Advertisement

Answer

Object properties can’t be reordered like array keys. You will have to create a new blank object (assuming stdClass objects), and then add in the properties in the desired order. First, let’s recreate the source object:

$old_obj = (object) [
    'name' => 'Teste',
    'key' => 'TESTE',
    'icon' => 'empty'
];

Then, here’s your new order:

$new_order = [
   'name',
   'icon',
   'key'
];

Then, we create a new object and add the properties in the desired order:

$new_obj = new stdClass();

foreach($new_order as $prop) {
    $new_obj->$prop = $old_obj->$prop;
}

This results in:

object(stdClass)#3 (3) {
    ["name"] · string(5) "Teste"
    ["icon"] · string(5) "empty"
    ["key"] · string(5) "TESTE"
}

If you need to do this often, turn the operation into a helper function:

function reorder_props(object $obj, array $order) {
    $new_obj = new stdClass();
    foreach($order as $prop) {
        $new_obj->$prop = $obj->$prop;
    }
    return $new_obj;
}

Another approach would be to create an associative array with the keys in the desired order, and then cast it into a stdClass object (as we did in instantiating your source object). You could also use the above function/logic for reordering array keys with very minor modifications.

User contributions licensed under: CC BY-SA
1 People found this is helpful
Advertisement