【问题标题】:Extract array from multidimentional array wrt key用键从多维数组中提取数组
【发布时间】:2012-08-06 08:43:46
【问题描述】:

我有一个数组

$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.这是最快的方法吗....?

【问题讨论】:

  • 我认为你不能在没有循环的情况下做到这一点。您的代码看起来不错。
  • 可以使用 array_walk()/array_map() 等来实现 - 但这只是穿不同外套的循环,在这种情况下,我怀疑它会 less 效率比你简单、有效且易读foreach。所以简而言之1.is it is the best way to doit? - 可能,是的。 2.is it possible to do it without loops. - 绝对不是,不。即使看起来不像循环的东西也只是下面的循环(在 C++ 源代码中)。 3.is it is the fastest way....? - 再次,可能是的。如果不是,我会感到惊讶。但是对于需要
  • 1.不,2。不,3。可能,说真的,即使有最快的方法,我怀疑它会对你的整体代码产生任何影响。
  • @IvanHušnjak 1. No - 想扩展吗?还是你的意思是Yes
  • @DaveRandom 哦,对不起,你是对的。我的意思是“是的,这是最好和最简单的方法”

标签: php arrays loops multidimensional-array


【解决方案1】:

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

  • 这是最好的方法吗?

可能,但它肯定是更简洁、最易读的方式

  • 是否可以不使用循环?

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

  • 这是最快的方法吗?

现在这需要进行一些调查。我使用 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: 说得好,虽然array_map 在这里可能比array_walk 更合适。不应该改变太多的性能数字。
  • 确实,使用 array_map() 稍微好一点:平均需要大约 0.20 英寸
  • 好的,这就是答案;感谢向我介绍 SplFixedArray
  • 现在在 PHP 5.5 中 array_column 可以完成这项工作。 php.net/manual/en/function.array-column.php
【解决方案2】:
  • 我认为最好的方式是你作为程序员的方式(但如果你在团队中,那么最好的方式就是团队方式)。
  • 我想我将永远依赖内置的 PHP 函数(某些函数除外)来解决性能问题(因为我认为 PHP 同行会根据需要努力改进它)。
  • 我认为没有循环是可以做到的。
$users = 数组(); $users[0]['id'] = 100; $users[1]['id'] = 101; $users[2]['id'] = 102; $ids = 数组(); array_walk_recursive($users, function($val, $key) use(&$ids){ if ($key == 'id') $ids[] = $val; }); print_r($ids); 大批 ( [0] => 100 [1] => 101 [2] => 102 )

【讨论】:

    猜你喜欢
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    • 1970-01-01
    相关资源
    最近更新 更多