当前位置: 首页 > 面试题库 >

array_diff如何工作?

嵇昱
2023-03-14
问题内容

array_diff()工作如何?它显然不能按以下方式工作:

function array_diff($arraya, $arrayb)
{
    $diffs = array();
    foreach ($arraya as $keya => $valuea)
    {
        $equaltag = 0;
        foreach ($arrayb as $valueb)     
        {
            if ($valuea == $valueb)
            {
                $equaltag =1;
                break;
            }
        }
        if ($equaltag == o)
        {
              $diffs[$keya]=$valuea;
        }

    }
    return $diffs;                          
}                                  //couldn't be worse than this

有谁知道更好的解决方案?

编辑@animuson:

function array_diff($arraya, $arrayb)
{
    foreach ($arraya as $keya => $valuea)
    {
        if (in_array($valuea, $arrayb))
        {
            unset($arraya[$keya]);
        }
    }
    return $arraya;
}

问题答案:

更新

  • [请参阅下面的更快/更好的代码。

  • array_diff的行为在PHP 5.3.4中要好得多,但仍比Leo的函数慢10倍。

  • 还值得注意的是,这些函数并不严格等同于array_diff它们,因为它们不维护数组键,即my_array_diff(x,y) == array_values(array_diff(x,y))

/更新

更好的解决方案是使用哈希映射

function my_array_diff($a, $b) {
    $map = $out = array();
    foreach($a as $val) $map[$val] = 1;
    foreach($b as $val) if(isset($map[$val])) $map[$val] = 0;
    foreach($map as $val => $ok) if($ok) $out[] = $val;
    return $out;
}

$a = array('A', 'B', 'C', 'D');
$b = array('X', 'C', 'A', 'Y');

print_r(my_array_diff($a, $b)); // B, D

基准

function your_array_diff($arraya, $arrayb)
{
    foreach ($arraya as $keya => $valuea)
    {
        if (in_array($valuea, $arrayb))
        {
            unset($arraya[$keya]);
        }
    }
    return $arraya;
}

$a = range(1, 10000);
$b = range(5000, 15000);

shuffle($a);
shuffle($b);

$ts = microtime(true);
my_array_diff($a, $b);
printf("ME =%.4f\n", microtime(true) - $ts);

$ts = microtime(true);
your_array_diff($a, $b);
printf("YOU=%.4f\n", microtime(true) - $ts);

结果

ME =0.0137
YOU=3.6282

任何问题?;)

而且,只是为了好玩,

$ts = microtime(true);
array_diff($a, $b);
printf("PHP=%.4f\n", microtime(true) - $ts);

结果

ME =0.0140
YOU=3.6706
PHP=19.5980

这是令人难以置信的!



 类似资料:
  • 问题内容: 我正在寻找一些工具来给我两个数组的递归差异。我设想的是一个带有两个颜色编码的树结构的网页。在每棵树上,绿色是数组中两个数组都匹配的部分,红色是每个数组中彼此不匹配的部分。像dBug的输出 我有一些代码,使我有一个嵌套的数组来填充报告。我正在开发应该更快的新方法,但是我需要测试值和结构,以确保其输出与旧方法相同。 有什么我可以使用的东西吗?还是我需要写这个?还是有其他方法可以实现我的目标

  • 本文向大家介绍PHP中的array_diff()函数,包括了PHP中的array_diff()函数的使用技巧和注意事项,需要的朋友参考一下 array_diff()函数比较数组值,并返回差值。它返回一个数组,其中包含第一个数组中其他任何数组中都不存在的条目。 语法 参数 arr1-要比较的数组。需要。 arr2-要比较的数组。需要。 arr3-您可以添加更多数组进行比较。可选的。 arr4-您可以

  • 问题内容: 使用,我可以比较和删除相似的项目,但是如果我有以下数组怎么办? 阵列1 数组2 我想过滤掉类似的物品;结果应该返回4.如何重新排列数组以便可以使用? 问题答案: 我可能会遍历原始数组并使它们成为一维的…类似

  • 问题内容: 我对如何使用动作监听器和实现它们有一个想法,但是我想知道是否有人可以告诉我他们如何监听事件?有某种轮询机制吗? 问题答案: 动作侦听器使用观察者模式注册事件,主事件循环会将它们注册的所有事件通知它们。所以不,这不是轮询(拉)机制,而是相反的(推)回调。这是“不给我们打电话,我们给您打电话”编程的一个例子。因为代码中的所有内容都在单个线程(事件循环)上运行,所以您不必担心不同事件之间的同

  • 问题内容: 我试图了解Collections.binarySearch如何在Java中工作。我不太明白我得到的输出。 此代码的输出为-1。 当按此顺序插入元素时 结果是0。我认为如果找不到该元素,则结果为负数。有人可以澄清我收到的输出吗? 问题答案: 您的数据必须根据给定的比较器进行排序,以使二进制搜索能够按预期工作。(如果不是,则行为是不确定的。) 在进行此调用之前,必须根据指定的比较器(通过方

  • 问题内容: 我正在尝试了解linux syscallsched_setaffinity()的工作方式。这是我在这里提出的问题的后续。 我有本指南,该指南说明了如何使用syscall并有一个非常简洁(工作!)的示例。 因此,我下载了Linux 2.6.27.19 内核源代码。 我对包含该系统调用的行进行了“ grep”操作,得到了91个结果。没有希望。 最终,我试图了解内核如何 为特定内核 (或处理