Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/247.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

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,假设我从类用户那里得到了一个对象数组。 类用户包含属性email。 如何从用户对象数组生成电子邮件属性数组 是否有比以下更好/更快的方法: $emails = array(); foreach($users as $user) { $emails[] = $user->email; } 看起来foreach循环是最快的。我想,句法是品味的问题 编辑 正如我在回复David的帖子时所说,事实上我已经对此进行了基准测试 for($i = 0;$i<=8000;$i++){

假设我从类用户那里得到了一个对象数组。 类用户包含属性email。 如何从用户对象数组生成电子邮件属性数组

是否有比以下更好/更快的方法:

$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的答案)。然而,我这里有两个警告

  • 微观基准是出了名的挑剔。它们因机器而异,并且取决于解释器的特定构建。但更糟糕的是,测量如此小的值可能会被其他任务(如处理器多任务、内存管理等)所掩盖。在使用回调函数和全局函数之间,时间也有很大差异

  • 开发人员的时间比CPU周期要昂贵得多。您最好先编写最容易编码和维护的解决方案,并在a)发现问题并测量问题的严重程度后才对其进行优化。显然,这对于这个简单的案例来说不太重要,但这是我学会遵守的一条一般规则


  • 好笑,不是在我的电脑上。刚刚做了一个基准测试,结果是有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);