PHP。是否可以将array_column与对象数组一起使用

PHP。是否可以将array_column与对象数组一起使用,php,Php,是否可以传入array\u列对象数组? 我已经实现了ArrayAccess接口,但没有效果。 我应该实施另一个吗 class Foo implements ArrayAccess { public $Id, $Title; public function offsetExists($offset) { return isset($this->{$offset}); } public function offsetGet(

是否可以传入
array\u列
对象数组?
我已经实现了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)
PHP 5

array\u column
不适用于对象数组。改用
array\u map

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

array\u column()

该函数现在支持对象数组以及 二维阵列。仅考虑公共财产,以及 将
\uuu get()
用于动态属性的对象也必须 实现
\uu isset()

看- 谢谢你的提示

可以在array_列中传递对象数组吗

PHP7

是的,看到了吗

PHP5>=5.5.0

在PHP5中,
array\u列
不适用于对象数组。您可以尝试以下方法:

// 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');
PS:为了清楚起见,我不喜欢使用
array\u列
,而是使用带有匿名函数的array\u映射

$result = array_map(function($o){ return $o->my_string; }, $arr_o);
或者一个简单的
foreach

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

虽然不能对子对象使用
array\u column
,但可以将它们强制转换为数组。这当然不是一条路,但这是一条路

使用
array\u map/get\u object\u vars
(在您的情况下不起作用,因为包含数组)

使用
json\u解码/json\u编码

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

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

函数对象到数组($object){
如果(is_object($object))$object=get_object_vars($object);
返回的是数组($object)?数组映射(\uuu函数\uuu,$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只针对数组,在实现ArrayAccess时,Array_column是php的内置函数,因此很难确定函数的具体工作方式。您希望返回什么?@Anthony,我希望得到的结果与它只是一个数组而不是对象一样。换句话说,我希望返回属性“Title”。可以通过
$array=json\u decode(json\u encode($array),TRUE)将对象数组转换为列数组
如果需要它来处理数组和对象,您将无法获得更好的性能。PHP7.0将支持array_列中的对象:对于任何对实际代码更改感兴趣的人,可以找到原始的pull请求;免责声明,这是我的:D@StanislavBelichenko在这种情况下,类型断言非常严格,只接受真数组。当您的错误报告配置正确时,它会告诉您:)@StanislavBelichenko我会看看我能做什么:)注意将对象强制转换为数组:因此,您建议完全迭代整个对象数组结构,将对象强制转换为数组,然后使用
array\u column()再次迭代整个数据集
?我不会的。
function array_column_portable($array, $key) {
    return array_map(function($e) use ($key) {
        return is_object($e) ? $e->$key : $e[$key];
    }, $array);
}