我有一个数组
$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.这是最快的方式......?
答案 0 :(得分:2)
上面的所有评论都很好地解决了这个问题,但由于没有人真正发布任何实际答案,这里有一些额外的信息(以证明我的答案):
可能,但它确实是更清洁,最易读的方式
是的,但正如人们所说,这只是一个技巧,因为循环将在后台使用。
现在需要进行一些调查。我使用100000个条目重新创建了一个类似的数组:
for ($i=0;$i<100000;$i++) {
$users[] = array('id' => rand(),
'name' => 'default');
}
使用不同的案例进行了一些测试:
1.Plain old for loop(你自己使用的那个):
$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个参数,它是最好的
答案 1 :(得分:0)
$users = array(); $users[0]['id'] = 100; $users[1]['id'] = 101; $users[2]['id'] = 102; $ids = array(); array_walk_recursive($users, function($val, $key) use(&$ids){ if ($key == 'id') $ids[] = $val; }); print_r($ids); Array ( [0] => 100 [1] => 101 [2] => 102 )