The most practical approach is simply to cast the object you are interested in back into an array, which will allow you to access the properties: $a = array('123' => '123', '123foo' => '123foo'); $o = (object)$a; $a = (array)$o; echo $o->{'123'}; // error!
The extract() function imports variables into the local symbol table from an array. This function uses array keys as variable names and values as variable values. For each element it will create a variable in the current symbol table. This function returns the number of variables extracted on success.
To remove a property from all objects in an array:Use the Array. forEach() method to iterate over the array. On each iteration, use the delete operator to delete the specific property. The property will get removed from all objects in the array.
If it is called an array or object depends on the outermost part of your variable. So [new StdClass] is an array even if it has (nested) objects inside of it and $object->property = array(); is an object even if it has (nested) arrays inside. And if you are not sure if you have an object or array, just use gettype() .
If you have PHP 5.5 or later, the best way is to use the built in function array_column()
:
$idCats = array_column($cats, 'id');
But the son has to be an array or converted to an array
Warning
create_function()
has been DEPRECATED as of PHP 7.2.0. Relying on this function is highly discouraged.
You can use the array_map()
function.
This should do it:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
As @Relequestual writes below, the function is now integrated directly in the array_map. The new version of the solution looks like this:
$catIds = array_map(function($o) { return $o->id;}, $objects);
The solution depends on the PHP version you are using. At least there are 2 solutions:
As @JosepAlsina said before the best and also shortest solution is to use array_column
as following:
$catIds = array_column($objects, 'id');
Notice:
For iterating an array
containing \stdClass
es as used in the question it is only possible with PHP versions >= 7.0
. But when using an array
containing array
s you can do the same since PHP >= 5.5
.
@Greg said in older PHP versions it is possible to do following:
$catIds = array_map(create_function('$o', 'return $o->id;'), $objects);
But beware: In newer PHP versions >= 5.3.0
it is better to use Closure
s, like followed:
$catIds = array_map(function($o) { return $o->id; }, $objects);
First solution creates a new function and puts it into your RAM. The garbage collector does not delete the already created and already called function instance out of memory for some reason. And that regardless of the fact, that the created function instance can never be called again, because we have no pointer for it. And the next time when this code is called, the same function will be created again. This behavior slowly fills your memory...
Both examples with memory output to compare them:
while (true)
{
$objects = array_map(create_function('$o', 'return $o->id;'), $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235616
4236600
4237560
4238520
...
while (true)
{
$objects = array_map(function($o) { return $o->id; }, $objects);
echo memory_get_usage() . "\n";
sleep(1);
}
// the output
4235136
4235168
4235168
4235168
...
Memory leak?! Is Garbage Collector doing right when using 'create_function' within 'array_map'?
function extract_ids($cats){
$res = array();
foreach($cats as $k=>$v) {
$res[]= $v->id;
}
return $res
}
and use it in one line:
$ids = extract_ids($cats);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With