【问题标题】:array values in multidimensional array多维数组中的数组值
【发布时间】:2011-03-13 21:43:07
【问题描述】:

我有两个数组

他们看起来像

$a1 = array(
  array('num' => 1, 'name' => 'one'),
  array('num' => 2, 'name' => 'two'),
  array('num' => 3, 'name' => 'three'),
  array('num' => 4, 'name' => 'four'),
  array('num' => 5, 'name' => 'five')
)

$a2 = array(3,4,5,6,7,8);

我想得到一个看起来像这样的数组

$a3 = array(3,4,5);

所以基本上$a1[$i]['num']$a2 中的位置

我知道我能做到

$a3 = array();

foreach($a1 as $num)
 if(array_search($num['num'], $a2))
   $a3[] = $num['num'];

但这似乎有很多不必要的迭代。

有没有更好的办法?


啊,快……
我刚刚意识到我问错了这个问题,我想得到一个看起来像的数组
$a3 array(
  array('num' => 3, 'name' => 'three'),
  array('num' => 4, 'name' => 'four'),
  array('num' => 5, 'name' => 'five')
)

【问题讨论】:

    标签: php arrays


    【解决方案1】:

    您可以从$a1 中提取相关信息'num' 项)

    $a1_bis = array();
    foreach ($a1 as $a) {
        $a1_bis[] = $a['num'];
    }
    

    然后,使用array_intersect() 查找$a1_bis$a2 中的内容:

    $result = array_intersect($a1_bis, $a2);
    var_dump($result);
    

    你会得到什么:

    array
      2 => int 3
      3 => int 4
      4 => int 5
    


    有了这个解决方案:

    • 您只经过$a1 一次
    • 您相信 PHP 会使用一种好的算法来找到两个数组之间的交集(和/或认为用 C 开发的函数可能比用纯 PHP 编写的任何等效函数更快)时间>



    评论后编辑:好吧,考虑到你想要的结果,现在,我会采用另一种方法。

    首先,我会使用array_flip()翻转 $a2 数组,以允许更快地访问其元素(通过键访问比查找值快得多) em>:

    $a2_hash = array_flip($a2); // To speed things up : 
                                // accessing by key is way faster than finding 
                                // an item in an array by value
    

    然后,我将使用array_filter()$a1 应用过滤器,将num 所在的项目保留在$a2_hash 翻转数组中:

    $result = array_filter($a1, function ($item) use ($a2_hash) {
        if (isset($a2_hash[ $item['num'] ])) {
            return true;
        }
        return false;
    });
    var_dump($result);
    

    注意:我使用了一个匿名函数,它只存在于 PHP >= 5.3 中;如果您使用的是 PHP

    这样,我得到了你想要的数组:

    array
      2 => 
        array
          'num' => int 3
          'name' => string 'three' (length=5)
      3 => 
        array
          'num' => int 4
          'name' => string 'four' (length=4)
      4 => 
        array
          'num' => int 5
          'name' => string 'five' (length=4)
    

    请注意,这些键与任何有用的东西都不对应——如果您希望它们删除,只需在该$result 上使用array_values() 函数:

    $final_result = array_values($result);
    

    但这可能没有必要:-)

    【讨论】:

    • 嗨帕斯卡,谢谢你,你能检查我的编辑facepalm
    • @Hailwook 我用另一种方法编辑了我的答案,考虑到你想要的结果,这让事情变得更容易:-)
    猜你喜欢
    • 1970-01-01
    • 2018-12-14
    • 2018-04-24
    • 2012-04-30
    • 2021-11-26
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多