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 回答