programing

PHP.

randomtip 2021. 1. 18. 07:54
반응형

PHP. 객체 배열과 함께 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)

PHP 5

array_column개체 배열과 함께 작동하지 않습니다. 사용 array_map하는 대신 :

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

PHP 7

array_column()

이 함수는 이제 2 차원 배열뿐만 아니라 객체 배열을 지원합니다. 공용 속성 만 고려 __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를 참조 하십시오.

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');

추신 : 명확성 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;
}

다음은 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 을 사용할 때 사용할 수 있습니다.


가능한 해결책은 다음과 같은 객체 배열을 준비하는 것입니다.

$objectsList = [];

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

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

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

Note: Using json brings not the same result as using a true recursive function. You’ll lose protected and private properties of the object. But in some situations its fine.

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


For future Visitor.

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

Thanks.

ReferenceURL : https://stackoverflow.com/questions/23335845/php-is-it-possible-to-use-array-column-with-an-array-of-objects

반응형