phparraysarray-reduce

How can I assign properties to an object in php specifically using array_reduce?


I have a simple php array that looks like this & I am looping over it to assign its keys as properties to an stdClass object & its values as the values of those keys. My code looks like this

$arr = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4, 'five' => 5];

$obj = new stdClass();

foreach ($arr as $key => $value) {
    $obj->{$key} = $value;
}

After this point, my $obj looks like this after a print in the popular laravel php repl, tinker. Its just convinient for me to work in there

 {#4867
    +"one": 1,
    +"two": 2,
    +"three": 3,
    +"four": 4,
    +"five": 5,
  }

A regular var_dump would look like

object(stdClass)#4867 (5) {
  ["one"]=>
  int(1)
  ["two"]=>
  int(2)
  ["three"]=>
  int(3)
  ["four"]=>
  int(4)
  ["five"]=>
  int(5)
}

but that's no biggie, my main question is why can't i set these properties in an array_reduce using array_keys to get the key & using the array above to grab the value of that key like so;

$arr = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4, 'five' => 5];

$obj = new stdClass();

$result = array_reduce(
    array_keys($arr),
    function ($carry, $curr) use ($arr) {
        return $carry->{$curr} = $arr[$curr];
    },
    $obj
);

Trying to run this piece of code throws the error Error Attempt to assign property "two" on int.

Am pretty sure am missing something because just passing an array with one element works, ie reducing ['one' => 1] using the same method produces an stdClass object with one property, one with a value of 1


Solution

  • Your array_reduce callback returns this expression:

    return $carry->{$curr} = $arr[$curr];
    

    But that does not return the object -- it is just the value that was assigned to one object property.

    You'll want the callback to always return the carry (accumulator).

    So have the callback do the assignment and then return the object:

    $carry->{$curr} = $arr[$curr];
    return $carry;