Вот код, который будет перебирать массив классов и выдвигать content_id
Свойство каждого элемента (если он существует) в массив:
# Collect content jobs ids from the job to process
$jobsToProcessContentIds = [];
foreach ( $jobsToProcess as $job ) {
if ( $job->content_id ?? null ) {
array_push( $jobsToProcessContentIds, $job->content_id );
}
}
Есть ли более короткий, более декларативный способ добиться этого?
<?php
class x
{
public $content_id="y";
}
class y
{
public $content="z";
}
$jobsToProcess=array(new x(), new y());$jobsToProcessContentIds=array();
foreach ($jobsToProcess as $job)
{
if (property_exists($job, "content_id"))
{
$jobsToProcessContentIds[]=$job->content_id;
}
}
print_r($jobsToProcessContentIds);
Выход:
Array
(
[0] => y
)
Это может быть не намного короче, но, кажется, хорошим выбором для декларативного подхода является использование array_reduce ().
$jobsToProcessContentIds = array_reduce($jobsToProcess, function($carry, $job) {
if ($job->content_id ?? null) {
$carry[] = $job->content_id;
}
return $carry;
});
Две линии могут быть сохранены с помощью короткого замыкания логический оператор И (Т.е. &&
), хотя некоторые утверждают, что это менее читабельно.
$jobsToProcessContentIds = array_reduce($jobsToProcess, function($carry, $job) {
($job->content_id ?? null) && $carry[] = $job->content_id;
return $carry;
});
Увидеть это продемонстрировано в это phpfiddle.