【问题标题】:Array Intersection - only once数组交点 - 只有一次
【发布时间】:2014-08-01 06:44:17
【问题描述】:

这里是新手,所以我对array_intersect函数有问题。我正在将两个数组与交集进行比较,但我得到了两次结果。例如:2个数组

$array1 = array(apple, orange, orange, apricot, melon, watermelon);
$array2 = array(apple, orange);

$result = array_intersect($array1, $array2); 这会返回:

$result = array(apple, orange, orange);

但我想要这个:

$result = array(apple, orange);

我希望这每个返回一次 appleorange。目前它返回苹果,然后是橙色,然后是另一个橙色。是我遗漏了什么还是我只是使用了错误的功能。

编辑:根据答案,我必须澄清这一点。如果第二个数组是

$array1 = array(apple, orange, orange, apricot, melon, watermelon);
$array2 = array(apple, orange, orange);

我希望结果有 2 个橙子,所以 array_unique 不会这样做。

$result = array(apple, orange, orange);

【问题讨论】:

  • 在结果数组中使用array_unique
  • @Ghost 我不能,请参阅编辑以进行澄清:D
  • 我看不出有什么意义,不久前您想分别返回一次appleorange。那么你想保留它。如果是这种情况,请不要使用它,array_intersect_assoc 也会检查索引,所以在这种情况下,它排成一行,$array1 = array(apple, orange, ..)$array2 = array(apple, orange),索引 0、1 和匹配的值也可以正常工作,如果 @987654336 @ 恰好在最后一个索引上,它不会工作,因为它也会检查索引
  • 你看过array_intersect_assoc()的描述了吗?显然不是。
  • 是的,似乎 assoc 不起作用:D

标签: php arrays array-intersect


【解决方案1】:

如果您只想要一次结果,则必须使用 array_unique() 过滤它们。 array_intersection() 只产生它们的共同点。那是橙色的,在你的情况下是 $array1 中的两次。问题是$array1为什么有两个橙色?

http://ch2.php.net/manual/en/function.array-unique.php

编辑:这可以工作:

$array1 = array('apple', 'orange', 'orange', 'apricot', 'melon', 'watermelon');
$array2 = array('apple', 'orange');
$result = array_intersect($array1, $array2);
$diff = array_diff($result, $array2);
if(!empty($diff)) {
    $result = array_unique($result);
}

【讨论】:

  • 干杯! :D 2 个橙子的原因:第一个数组是要约。第二个是购物车。现在,如果它符合报价,购物车应该自动绑定到报价,但是这样您可以获得报价,少一个橙色,仍然符合报价。
  • 产生某种错误Fatal error: Can't use function return value in write context in /web/com/140687550521433/main.php on line 12
  • 在这种情况下,只需将 array_diff() 放入变量中即可。
  • 我做到了,但它没有按预期工作,但问题得到了回答 :) 感谢您的时间和努力
  • 我希望你的脚本能正常工作,这样我就可以继续我的项目了 :) 但不幸的是,当我在第二个数组中有 2 个橙子时,它不能按预期工作,请参阅更新后的问题
【解决方案2】:

所有早期的答案都错过了您的意图。您希望保留来自$array2 的元素,这些元素位于$array1 中。您只需要反转 order 函数参数。 array_intersect() 从第一个参数返回值,这些值在后续参数中找到。

代码:(Demo)

$array1 = ['apple', 'orange', 'orange', 'apricot', 'melon', 'watermelon'];
$array2 = ['apple', 'orange', 'orange'];

var_export(
    array_intersect($array2, $array1)
);

输出:

array (
  0 => 'apple',
  1 => 'orange',
  2 => 'orange',
)

【讨论】:

    【解决方案3】:

    遍历第一个数组。如果第二个数组有值,则将其放入结果并从第二个数组中删除。

    $array1 = array('apple', 'orange', 'orange', 'apricot', 'melon', 'watermelon');
    $array2 = array('apple', 'orange');
    $array3 = array('apple', 'orange', 'orange');
    
    function my_intersect($array1, $array2)
        {
        // array_walk($array1, 'sort');
        // array_walk($array2, 'sort');
        return array_filter($array1, function($item)use(&$array2)
            {
            if (($key = array_search($item, $array2)) !== false)
                {
                unset($array2[$key]);
                return true;
                }
            return false;
            });
        }
    
    var_dump(my_intersect($array1, $array2)); // 'apple', 'orange'
    var_dump(my_intersect($array1, $array3)); // 'apple', 'orange', 'orange'
    

    【讨论】:

    • 我不明白你在my_intersect 函数中的第三行,它也会产生某种错误。
    • scratch 错误来自我的编辑器运行良好!欢呼:D
    • 我知道。这也适用于更复杂的数组吗?即,而不是 applesoranges,(单个变量)来存储数组,$array1=($fruits,$drinks);
    • @alexandros ,您需要对内部数组进行排序以进行比较。查看添加的 cmets。
    • hm 是我需要实现的“排序”功能吗? :D
    【解决方案4】:

    试试这个

    <?php
    $array1 = array('apple', 'orange', 'orange', 'apricot', 'melon', 'watermelon');
    $array2 = array('apple', 'orange');
    $result = array_intersect($array1, $array2);
    $result = array_unique($result);
    ?>
    

    【讨论】:

    • 提问者的第二个例子表明这不是array_unique()-已解决的问题。
    【解决方案5】:

    这对我有用

    $result = array_flip( array_flip( array_intersect($array1, $array2) ) );
    

    【讨论】:

    • 这不适合提问者的第二个例子,因为双翻转会破坏重复的值。
    【解决方案6】:

    你可能需要这样的东西吗? http://php.net/manual/en/function.array-intersect-assoc.php

    $array1 = array('apple', 'orange', 'orange', 'apricot', 'melon', 'watermelon');
    $array2 = array('apple', 'orange');
    $array3 = array('apple', 'orange', 'orange');
    
    
    var_dump(array_intersect_assoc($array1,$array2));
    var_dump(array_intersect_assoc($array1,$array3));
    

    【讨论】:

    • array_intersect_assoc() 肯定不是这里的解决方案。
    猜你喜欢
    • 2011-02-02
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    相关资源
    最近更新 更多