Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 是否有从多个对象获取属性值数组的本机方法?_Php_Oop - Fatal编程技术网

Php 是否有从多个对象获取属性值数组的本机方法?

Php 是否有从多个对象获取属性值数组的本机方法?,php,oop,Php,Oop,我经常遇到这样一种情况:我必须从多个对象获取一个值数组。让我用一个虚构的场景和一些代码来澄清这一点 假设我创建了一个类 class MyObject { public $x = 0; public $y = 0; } 我有一个实例数组 $instances = array( new Object, new Object, new Object ); 我想把所有的x属性作为字符串连接起来,用逗号分隔。。。我将不得不使用一个循环 $array = arra

我经常遇到这样一种情况:我必须从多个对象获取一个值数组。让我用一个虚构的场景和一些代码来澄清这一点

假设我创建了一个类

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
这完全可行,但我非常反对不必要的循环和亲本机的实现,因为我对性能有点痴迷——我不喜欢在巨大的数组中循环,只为了从每个实例中获得一个属性

是否有从多个对象获取属性值数组的本机方法?如果有,如何获取?如果没有,你知道为什么没有吗


提前感谢。

我发现解决此问题的最简单方法是使用
数组\u map()
,如下所示:

implode(',', array_map(
  function ($object) { return $object->property; }, 
  $instances));

我找到的解决此问题的最简单方法是使用
array\u map()
,如下所示:

implode(',', array_map(
  function ($object) { return $object->property; }, 
  $instances));

一个简单的方法是使用
array\u 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\u reduce

$str = trim(array_reduce($instances, function($a,$b){ $a .= $b->x . "," ; return $a;}),",");
echo $str ;
两者都会输出

0,0,0
您还可以修改类以使用
\uuu 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

一个简单的方法是使用
array\u 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\u reduce

$str = trim(array_reduce($instances, function($a,$b){ $a .= $b->x . "," ; return $a;}),",");
echo $str ;
两者都会输出

0,0,0
您还可以修改类以使用
\uuu 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

OP希望避免循环<代码>数组\映射将在数组上进行内部迭代。顺便说一句,在给定的情况下,我看不到任何避免迭代的方法。@PLB几乎所有的东西都是循环的。。甚至时间在内部也是一个循环。。事实上,您正在处理多个无法避免的实例,loopOP希望避免循环<代码>数组\映射将在数组上进行内部迭代。顺便说一句,在给定的情况下,我看不到任何避免迭代的方法。@PLB几乎所有的东西都是循环的。。甚至时间在内部也是一个循环。。事实上,你正在处理多个实例,你无法避免循环!PHP的功能让我惊讶不已,我不知道它们的存在是完全适合这项工作的。谢谢精巧的PHP的功能让我惊讶不已,我不知道它们的存在是完全适合这项工作的。谢谢