从多维数组wrt键中提取数组


Extract array from multidimentional array wrt key

我有一个数组

$users    = array();
$users[0]['id']=1;
$users[0]['name']="user1";
$users[1]['id']=2;
$users[1]['name']="user2";
$users[2]['id']=3;
$users[2]['name']="user3";

我需要将id提取到另一个数组$ids中;使得

$ids[0]=1;
$ids[1]=2;
$ids[2]=3;

我知道一种方法…

$ids    = array();
foreach($users as $user){
   $ids[]  = $user['id'];
}

但是

1.这是最好的方法吗?2.有可能在没有循环的情况下做这件事吗。3.这是最快的路吗。。。。?

上面的所有评论都很好地解决了这个问题,但由于没有人发布任何实际的答案,这里有一些额外的信息(证明我的回答是正确的):

  • 这是最好的方法吗

可能吧,但这肯定是最干净、最可读的方法

  • 有可能在没有循环的情况下完成吗

是的,但正如人们所说,这只是一个技巧,因为循环将在后台使用。

  • 这是最快的路吗

现在这需要一些调查。我使用100000个条目重新创建了一个与您类似的数组:

for ($i=0;$i<100000;$i++) {
    $users[] = array('id' => rand(),
            'name' => 'default');
}

并使用不同的案例进行了一些测试:

1.普通的旧循环(你自己用过的):

$ids=array();
$t = microtime(true);
foreach ($users as $key => $value) {
    $ids[] = $value['id'];
} 
echo microtime(true)-$t;

这需要平均0.085英寸的

2.使用array_walk():

$t = microtime(true);
array_walk($users, create_function('$v,$k,&$ids', '$ids[0][] = $v["id"];'), array(&$ids));
echo microtime(true)-$t;

这平均需要0.22''(当使用$GLOBALS['ids']而不是这个"参考"破解时也是如此)

3.使用splFixedArray:这个迭代器应该比普通数组更快。事实上,上面的代码平均需要0.075英寸:

$users = new SplFixedArray(100000);
for ($i=0;$i<100000;$i++) {
    $users[$i] = array('id' => rand(),
            'name' => 'default');
}
$ids=array();
$t = microtime(true);
foreach ($users as $key => $value) {
    $ids[$key] = $value['id'];
}
echo microtime(true)-$t;

而下面的代码,我们对两个数组都使用splFixedArray,执行速度更快,大约为0.062'':

$users = new SplFixedArray(100000);
for ($i=0;$i<100000;$i++) {
    $users[$i] = array('id' => rand(),
            'name' => 'default');
}
$ids=new SplFixedArray(100000);
$t = microtime(true);
foreach ($users as $key => $value) {
    $ids[$key] = $value['id'];
}
echo microtime(true)-$t;

所以,底线是不,这不是最快的方法,但如果你考虑到你在最初的问题中提出的所有3个参数,这是最好的

  • 我认为最好的方式是你作为程序员的方式(但如果你在团队中,那么最好的方式就是团队方式)
  • 我想我会永远依赖内置的PHP函数(除了一些函数)来解决性能问题(因为我认为PHP同行会根据需要努力改进它)
  • 我认为这是可能的,没有循环
$users=array();$users[0]['id']=100;$users[1]['id']=101;$users[2]['id']=102;$ids=数组();array_walk_recurive($users,function($val,$key)use(&$ids){if($key=="id")$ids[]=$val;});print_r($ids);大堆([0]=>100[1] =>101[2] =>102)