Php 从对象数组中生成一个属性的数组
假设我从类用户那里得到了一个对象数组。 类用户包含属性email。 如何从用户对象数组生成电子邮件属性数组 是否有比以下更好/更快的方法:Php 从对象数组中生成一个属性的数组,php,oop,Php,Oop,假设我从类用户那里得到了一个对象数组。 类用户包含属性email。 如何从用户对象数组生成电子邮件属性数组 是否有比以下更好/更快的方法: $emails = array(); foreach($users as $user) { $emails[] = $user->email; } 看起来foreach循环是最快的。我想,句法是品味的问题 编辑 正如我在回复David的帖子时所说,事实上我已经对此进行了基准测试 for($i = 0;$i<=8000;$i++){
$emails = array();
foreach($users as $user) {
$emails[] = $user->email;
}
看起来foreach循环是最快的。我想,句法是品味的问题 编辑 正如我在回复David的帖子时所说,事实上我已经对此进行了基准测试
for($i = 0;$i<=8000;$i++){
$users[] = (object)array("email"=>rand(0,15));
}
$arrMapBm = new nzpBM("arrMap");
$foreachBm = new nzpBM("foreach");
$arrMapBm->start();
$emails = array_map(function ($user) { return $user->email; }, $users);
echo $arrMapBm;
unset($emails);
$foreachBm->start();
foreach($users as $user) {
$emails[] = $user->email;
}
echo $foreachBm;
我不知道这是否是因为我现在在windows机器上,但对我来说,数组映射肯定是而不是更快。不要试图误导这里的任何人。您可以使用它在C中执行循环,但每次迭代都需要调用PHP
$emails = array_map(function ($user) { return $user->email; }, $users);
更好?
以上代码对我和大多数函数式程序员来说更具表现力,但这是主观的。回调还需要PHP5.3。对于PHP5.2及以下版本,您可以通过声明一个全局函数来解决这个问题,但随后会失去很多清晰度,尤其是当代码出现在类中时
function getUserEmail($user) { return $user->email; }
$emails = array_map('getUserEmail', $users);
更快?
在这个回调的简单例子中,它似乎要慢一些(参见Esben的答案)。然而,我这里有两个警告
好笑,不是在我的电脑上。刚刚做了一个基准测试,结果是有2000个用户对象,看起来是这样的:基准测试“arrMap(2)”花费了1.2409687042236毫秒基准测试“foreach(2)”花费了0.43201446533203毫秒,与perl中的
map{}@array
和perl中的collect
相似SmallTalk@EsbenTind-与大多数微观基准一样,它因具体情况而变化很大。使用foreach
访问这样一个简单的公共属性会更快,但是当我切换到调用函数时,array\u map
会更快。无论哪种方式,除非对foreach
有显著的性能改进,否则我更喜欢更具表现力的array\u map
。OP描述了一个非常基本的功能。从数组中提取所有电子邮件地址。根据我的测试,用foreach做这件事只需要不到一半的时间。你节省了50%以上。我同意这真的不重要,因为我们可能不会有这么多的用户对象。但是说我的回答是错误的,在这种情况下是不正确的。无论如何,在我的环境中不是这样。@EsbenTind-OP要求一个“更好/更快的方法”。你的回答看起来好像没有其他不正确的方法。如果您从您的答案中编辑该部分,我很乐意删除我的否决票。请使用全局函数进行尝试:函数getUserEmail($user){return$user->email;}
和数组映射('getUserEmail',$users)
。微观基准是出了名的变化无常。:)更糟糕的是:在8000个对象上,基准测试“arrMap(1)”耗时7.3180198669434毫秒,而基准测试“foreach(1)”耗时1.969099047998毫秒。我很好奇,您是否能从中得到同样的结果。在我的Xubuntu开发机器上运行时,我使用回调加快了foreach的速度,使用全局函数加快了array映射的速度。尽管回调比函数array\u map
快,但运行foreach需要5.650毫秒运行array\u map需要11.492毫秒,这是全局函数引用。对于我发布的代码,在我们的Core2 Duo Ubuntu服务器上,时间非常接近foreach
分别使用了12.056(回调)和14.391(函数),而array_map
分别使用了12.340(回调较慢)和14.267(函数较快)。秩序也很重要。无论哪一个先执行,都需要比另一个稍长的时间,因为它必须将内存分配给进程,而第二个版本可以重用释放的内存。
function getUserEmail($user) { return $user->email; }
$emails = array_map('getUserEmail', $users);