两个PHP数组,未设置的位置仅存在于一个数组中

时间:2014-04-24 21:27:05

标签: php arrays for-loop unset array-unset

我有两个数组(在PHP中):

ArrayA
(
    [0] => 9
    [1] => 1
    [2] => 2
    [3] => 7
)

ArrayB
(
    [0] => 1
    [1] => 1
    [3] => 8
)

我想创建两个新数组,其中我只在两个数组中声明了元素,如下所示:

ArrayA
(
    [0] => 9
    [1] => 1
    [3] => 7
)

ArrayB
(
    [0] => 1
    [1] => 1
    [3] => 8
)

在此示例中,ArrayA [2]不存在,因此未设置ArrayB [2]。

我为循环编写了这个:

for ($i = 0, $i = 99999, $i++){
    if (isset($ArrayA[$i]) AND isset($ArrayB[$i]) == FALSE)
    {
        unset($ArrayA[$i],$ArrayB[$i]);
    } 
}

但它并不好,因为它会尝试介于0和非常大的数字之间的每个索引(在这种情况下为99999)。如何改进我的代码?

4 个答案:

答案 0 :(得分:2)

您正在寻找的功能是array_intersect_key

  

array_intersect_key()返回一个数组,其中包含array1的所有条目,其中包含所有参数中都存在的键。

由于你需要两个数组,你必须运行它两次,参数顺序相反,因为它只保留第一个数组的键。一个例子:

$arrayA_filtered = array_intersect_key($arrayA, $arrayB);
$arrayB_filtered = array_intersect_key($arrayB, $arrayA);

此外,尽管for循环在这种情况下并不理想,但在其他情况下,您发现自己需要遍历稀疏数组(不是每个数字都设置),您可以使用foreach循环:

foreach($array as $key => $value) {
    //Do stuff
}

答案 1 :(得分:1)

foreach($arrayA as $k=>$a)
    if (!isset($arrayB[$k]))
        unset($arrayA[$k];

答案 2 :(得分:1)

关于PHP数组的一个非常重要的注意事项是它们是关联的。您不能简单地使用for循环,因为索引不一定是整数范围。考虑如果您应用此算法两次会发生什么!当$arrayA[2]$arrayB[2]不再存在时,您就会出现界限错误!

我将使用嵌套的foreach语句遍历数组。即。

$outputA = array();
$outputB = array();
foreach ($arrayA as $keyA => $itemA) {
    foreach ($arrayB as $keyB => $itemB) {
        if ($keyA == $keyB) {
            $outputA[$keyA] = $itemA;
            $outputB[$keyB] = $itemB;
    }
}

这应该为您提供两个数组$outputA$outputB,它们看起来就像$arrayA$arrayB,除了它们只包含key =>值对,如果密钥存在于两个原始数组中。

答案 3 :(得分:-1)