2

複数のオブジェクトから取得した値の配列を取得する必要がある状況に遭遇することがよくあります。架空の状況といくつかのコードでそれを明確にしましょう。

クラスを作成したと想像してください...

class MyObject {
    public $x = 0;
    public $y = 0;
}

インスタンスの配列があります...

$instances = array(
    new Object,
    new Object,
    new Object
);

xそして、すべてのプロパティをコンマで区切られた文字列として結合したいのですが...ループを使用する必要があります...

$array = array();

foreach($instances as $instance) array_push($array, $instance->x);

$str = implode(',', $array); // holds an array of all x values

それは完全に機能しますが、パフォーマンスに少し執着しているため、不要なループやプロネイティブの実装には非常に反対です。巨大な配列をループして、すべてのインスタンスから単一のプロパティを取得することは嫌いです。

複数のオブジェクトからプロパティ値の配列を取得するネイティブな方法はありますか?もしそうなら、どのように?そうでない場合は、なぜそうしないのですか?

前もって感謝します。

4

2 に答える 2

3

シンプルで簡単な方法は、使用することですarray_map

class MyObject {
    public $x = 0;
    public $y = 0;
}

$instances = array(
        new MyObject,
        new MyObject,
        new MyObject
);


$str = implode(",",array_map(function($v){ return $v->x;},$instances));
echo $str ; 

またはarray_reduce

$str = trim(array_reduce($instances, function($a,$b){ $a .= $b->x . "," ; return $a;}),",");
echo $str ;

両方が出力されます

0,0,0

__toString()例を使用するようにクラスを変更することもできます

class MyObject {
    public $x = 0;
    public $y = 0;
    function __toString() {
        return $this->x . "," . $this->y;
    }
}

$instances = array(new MyObject(),new MyObject(),new MyObject());
echo implode("\n", $instances);

出力

0,0
0,0
0,0
于 2012-12-06T12:05:33.597 に答える
1

この問題に対して私が見つけた最も簡単な解決策はarray_map()、次のように を使用することです。

implode(',', array_map(
  function ($object) { return $object->property; }, 
  $instances));
于 2012-12-06T12:05:03.843 に答える