1. ホーム
  2. php

PHPです。array_column をオブジェクトの配列で使用することは可能ですか?

2023-10-31 17:13:06

質問

を渡すことは可能でしょうか? 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 - おかげさまで ベル に感謝します。