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

时间:2014-04-28 08:13:25

标签: php

是否可以传入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)

6 个答案:

答案 0 :(得分:105)

PHP 5

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 - 感谢Bell提示!

答案 1 :(得分:7)

  

是否可以在array_column中传入一个对象数组?

PHP 7

是的,请参阅http://php.net/manual/en/function.array-column.php

PHP 5> = 5.5.0

在PHP 5中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');

PS:为清楚起见,我宁愿不使用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;
}

答案 2 :(得分:1)

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

$objectsList = [];

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

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

答案 3 :(得分:1)

这是一个可以在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时使用它

答案 4 :(得分:0)

虽然无法在子对象上使用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;
}




答案 5 :(得分:-1)

未来访客。

$arrayColumnData = array_map(function($e) {
    return is_object($e) ? $e->your_column : $e['your_column'];
}, $yourArray);

感谢。