PHP将数组元素作为整体进行比较

3
例如我有两个数组,
$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

更新

在尝试了amow和提供的答案之后,我意识到这种方法存在一定的限制。如果我的数组是以下形式,

$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));
< p > < code > $same 的结果仍然是
1 => B,
2 => C

where I'm hoping to get

1 => B,
2 => C,
3 => B,
4 => C
3个回答

2

array_intersect(array_unique($arrayA),array_unique($arrayB))
希望这能帮到你。

array_unique文档

带更新的解决方案:

$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);

我已经更新了我的问题,你能否请看一下? - Tommy Lee
谢谢...但我必须得到来自数组A的索引作为结果,而不是来自数组B的索引。 - Tommy Lee
如果我只使用 array_intersect,那么在数组B中包含 [B,C,B,C] 或 [B,C] 时,将返回相同的结果;而我想要实现的是两种情况都应该分别返回 [1=>B,2=>C,3=>B,4=>C][1=>B,2=>C] - Tommy Lee
我认为你可以简化代码,只需使用 if($bIndex !== false){ ... } 处理两种情况。 - Ekin

2
上述内容是正确的,你只需要将交集用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 )

谢谢。我已经尝试了你的方法,但是我意识到它有一定的限制。你能否请看一下我更新后的问题? - Tommy Lee
在这种情况下,仅交集是否可以正常工作?@TommyLee,我还在尝试几次,但请参见https://3v4l.org/JjR34 - Ekin
如果我只使用 array_intersect,那么在数组B中包含 [B,C,B,C] 或 [B,C] 时,将返回相同的结果;而我想要实现的是两种情况都应该分别返回 [1=>B,2=>C,3=>B,4=>C][1=>B,2=>C] - Tommy Lee
如果您交换参数并使用$arrayB作为第一个参数,仅使用交集(intersection),则会得到Array ( [0] => B [1] => C [2] => B [3] => C )Array ( [0] => B [1] => C )。您确定键应该从1开始,@TommyLee? - Ekin
是的,我必须从数组A中获取索引而不是数组B,因为我想要在数组A中交叉点之后获取元素。也许有其他方法可以代替array_intersect吗? - Tommy Lee

0
$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的结果。 - Tommy Lee
更新了代码,从1开始而不是0,我想这就是你所需要的。 - Iyad Khaddour

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接