是否可以对对象数组使用 array_column

有没有可能在 array_column中传递一个对象数组?
我已经实现了 ArrayAccess 接口,但是没有效果。
我应该再实施一个吗?

class Foo implements ArrayAccess {


public $Id, $Title;


public function offsetExists($offset)
{
return isset($this->{$offset});
}


public function offsetGet($offset)
{
return $this->{$offset};
}


public function offsetSet($offset, $value)
{
$this->{$offset} = $value;
}


public function offsetUnset($offset)
{
unset($this->{$offset});
}
}


$object = new \Foo();
$object->Id = 1;
$object->Title = 'Test';


$records = array(
$object,
array(
'Id' => 2,
'Title' => 'John'
)
);


var_dump(array_column($records, 'Title')); // array (size=1) 0 => string 'John' (length=4)
64819 次浏览

PHP5

array_column不能处理对象数组。改为使用 array_map:

$titles = array_map(function($e) {
return is_object($e) ? $e->Title : $e['Title'];
}, $records);

PHP 7

array_column()

该函数现在支持对象数组以及 二维数组。只考虑公共属性,以及 对动态属性使用 __get()的对象也必须 实施 __isset()

https://github.com/php/php-src/blob/PHP-7.0.0/UPGRADING#L629- 感谢 贝尔的提示!

是否可以在 array _ column 中传递一个对象数组?

PHP 7

是的,看 http://php.net/manual/en/function.array-column.php

PHP5 > = 5.5.0

在 PHP5中,array_column不能处理对象数组。您可以尝试使用:

// object 1
$a = new stdClass();
$a->my_string = 'ciao';
$a->my_number = 10;


// object 2
$b = new stdClass();
$b->my_string = 'ciao b';
$b->my_number = 100;


// array of objects
$arr_o = array($a,$b);


// using array_column with an array of objects
$result = array_column(array_map(function($o){return (array)$o;},$arr_o),'my_string');

为了清楚起见,我不想使用 array_column,而是使用 array _ map 和一个匿名函数

$result = array_map(function($o){ return $o->my_string; }, $arr_o);

或者简单的 foreach

$result = array();
foreach($arr_o as $o) {
$result[] = $o->my_string;
}

虽然不可能在子对象上使用 array_column,但是可以将它们强制转换为数组。这当然不是解决问题的方法,但这是一种方法。

使用 array_map/get_object_vars (由于包含数组,在您的情况下不起作用)

array_column(array_map('get_object_vars', $thingy), 'property');

使用 json_decode/json_encode

array_column(json_decode(json_encode($thingy), true), 'property');

Https://eval.in/597950

注意: 使用 json 与使用真正的递归函数带来的结果不同。您将失去对象的受保护和私有属性。但在某些情况下,这没问题。

function object_to_array($object) {
if (is_object($object)) $object = get_object_vars($object);
return is_array($object) ? array_map(__FUNCTION__, $object) : $object;
}

可能的解决方案是准备对象数组:

$objectsList = [];


foreach ($objs as $obj) {
$objectsList[] = (array)$obj;
}


$propList = array_column($objectsList, 'prop');

下面是一个同时适用于 php7和 php5的函数

function array_column_portable($array, $key) {
return array_map(function($e) use ($key) {
return is_object($e) ? $e->$key : $e[$key];
}, $array);
}

然后可以像在 php7中使用 Array _ column一样使用它