我经常遇到一种情况,我必须从多个对象中获取一组值。让我用虚构的情况和一些代码来澄清。
想象一下,我创造了一个班级......
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
这样做完全有效,但我非常反对不必要的循环和专业实现,因为我对性能有点痴迷 - 我不喜欢循环遍历大型数组只是为了从每个实例中获取一个属性。
是否存在从多个对象获取属性值数组的本机方法?如果是,如何?如果没有,任何想法为什么不呢?
提前致谢。
答案 0 :(得分: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
答案 1 :(得分:1)
我发现此问题的最简单方法是使用array_map()
,如下所示:
implode(',', array_map(
function ($object) { return $object->property; },
$instances));