【问题标题】:PHP comparing array elements as a wholePHP比较数组元素作为一个整体
【发布时间】:2016-10-19 02:05:43
【问题描述】:

例如我有两个数组,

$arrayA = [0=>"A", 1=>"B", 2=>"C", 3=>"C", 4=>"E", 5=>"F"];
$arrayB = [0=>"B", 1=>"C"];

如果我使用array_intersect()

$same = array_intersect($arrayA, $arrayB);

我会得到$same的结果

1 => B
2 => C
3 => C

相反,我想要实现的只是得到

1 => B
2 => C

更新

在尝试amowEkin提供的答案后,我意识到这种方法存在局限性。如果我的数组是下面的形式,

$arrayA = [0=>"A", 1=>"B", 2=>"C", 3=>"B", 4=>"C", 5=>"E", 6=>"F"];
$arrayB = [0=>"B", 1=>"C", 2=>"B", 3=>"C"];
$same = array_unique(array_intersect($arrayA, $arrayB));

$same 的结果仍然是

1 => B,
2 => C

我希望得到的地方

1 => B,
2 => C,
3 => B,
4 => C

【问题讨论】:

    标签: php arrays algorithm


    【解决方案1】:

    array_intersect(array_unique($arrayA),array_unique($arrayB))
    希望这能有所帮助。

    array_unique doc

    有更新的解决方案:

    $arrayA = [0=>"A", 1=>"B", 2=>"C", 3=>"B", 4=>"C", 5=>"E", 6=>"F"];
    $arrayB = ["B","C","B","C"];
    $filter = $arrayB;
    $same = [];
    foreach ($arrayA as $key => $value) {
        $bIndex = array_search($value, $filter);
        if($bIndex !== false){
            $same[$key] = $value;
            unset($filter[$bIndex]);
        }
    }
    var_dump($same);
    

    【讨论】:

    • 我已经更新了我的问题,你能看一下吗?
    • 谢谢...但是我必须从 arrayA 获取索引,而不是从 arrayB 获取索引
    • 如果我单独使用array_intersect,在arrayB 中有[B,C,B,C] 或[B,C] 会返回相同的结果;而我想要实现的是两种情况都应该分别返回我[1=>B,2=>C,3=>B,4=>C][1=>B,2=>C]
    • 我认为您可以将其简化为只为您的两个案例使用if($bIndex !== false){ ... }
    【解决方案2】:

    以上是正确的,您也可以将 intersect 包装在 array_unique() 中。喜欢:

    $arrayA = [0=>"A", 1=>"B", 2=>"C", 3=>"C", 4=>"E", 5=>"F"];
    $arrayB = [0=>"B", 1=>"C"];
    $same = array_unique(array_intersect($arrayA, $arrayB));
    
    print_r($same);
    
    # Array ( [1] => B [2] => C )
    

    【讨论】:

    • 谢谢..我试过你的方法,我意识到它有一定的局限性..你能看看我更新的问题吗?
    • 在这种情况下,单独的交叉点可以正常工作吗? @TommyLee,我仍在尝试,但请参阅 3v4l.org/JjR34
    • 如果我单独使用array_intersect,在arrayB 中有[B,C,B,C] 或[B,C] 会返回相同的结果;而我想要实现的是两种情况都应该分别返回我[1=>B,2=>C,3=>B,4=>C][1=>B,2=>C]
    • 如果您切换参数并使用$arrayB 作为第一个参数,只需交集,您将获得Array ( [0] => B [1] => C [2] => B [3] => C )Array ( [0] => B [1] => C )。您确定您的密钥应该从 1 @TommyLee 开始吗?
    • 是的,我必须从 arrayA 而不是 arrayB 获取索引,因为我想在 arrayA 中获取交叉点之后的元素。也许除了array_intersect 之外还有其他方法吗?
    【解决方案3】:
    $arrayA = [0=>"A", 1=>"B", 2=>"C", 3=>"C", 4=>"E", 5=>"F"];
    $arrayB = [0=>"B", 1=>"C"];
    $result = array();
    
    foreach ($arrayB as $key => $value) {
       if($key = array_search($value, $arrayA)){
       $result[$key] = $arrayA[$key];
       }
    }
    
    print_r($result);
    

    你会得到:

    Array ( [1] => B [2] => C )
    

    【讨论】:

    • 不是我想要的,我想要的是1=>B, 2=>C的结果
    • 将代码更新为从 1 开始而不是 0,我认为这就是你所需要的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-17
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    相关资源
    最近更新 更多