【发布时间】:2011-04-06 05:18:56
【问题描述】:
有没有办法将数组中包含的相似对象的值内爆?我有一个对象数组:
$this->inObjs
我想要每个messageID 属性的逗号分隔字符串:
$this->inObjs[$i]->messageID
有没有一种优雅的方法来做到这一点,还是我必须MacGyver 使用get_object_vars 或foreachs 或类似的解决方案?感谢您的帮助。
【问题讨论】:
有没有办法将数组中包含的相似对象的值内爆?我有一个对象数组:
$this->inObjs
我想要每个messageID 属性的逗号分隔字符串:
$this->inObjs[$i]->messageID
有没有一种优雅的方法来做到这一点,还是我必须MacGyver 使用get_object_vars 或foreachs 或类似的解决方案?感谢您的帮助。
【问题讨论】:
$allMessageID = '';
foreach ($this->inObjs as $objectDetail) :
$allMessageID[] = $objectDetail->messageID;
endforeach;
$allMessageID_implode = implode(",", $allMessageID);
echo $allMessageID_implode;
【讨论】:
如果可以修改类,可以实现__toString:
class MyObject {
private $messageID = 'Hello';
public function __toString() {
return $this->messageID;
}
}
// ...
$objectList = array(new MyObject, new MyObject);
echo implode(',', $objectList);
// Output: Hello,Hello
【讨论】:
我发现最简单的方法是使用array_map
$messageIDs = array_map( function($yourObject) { return $yourObject->messageID; }, $this->inObjs );
$string = implode(", ", $messageIDs );
【讨论】:
$messageIDArray;
foreach($this->inObjs as $obj){
$messageIDArray[] = $obj->messageID;
}
$string = implode(',',$messageIDArray);
【讨论】:
$messageIDArray = [];
我通常针对这种情况做一个Helper,这样使用
function GetProperties(array $arrOfObjects, $objectName) {
$arrProperties = array();
foreach ($arrOfObjects as $obj) {
if ($obj->$objectName) {
$arrProperties[] = $obj->$objectName;
}
}
return $arrProperties;
}
【讨论】:
这里有两个班轮:
array_walk($result, create_function('&$v', '$v = $v->property;'));
$result = implode(',', $result);
或者:
array_walk($result, function(&$v, &$k) use (&$result) { $v = $v->name; } );
$result = implode(',', $result);
$v->property 是您要内爆的对象属性名称。
另见array_map()。
【讨论】:
, &$k 和use (&$result)?请重温这篇文章。我想用这个页面关闭另一个。