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



我有两个数组(在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)之间的每个索引。如何改进我的代码?

您要查找的函数是array_entersect_key:

array_entersect_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
}

关于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,只是如果键存在于两个原始数组中,它们只包括键=>值对。

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

查看php:array_diff

http://docs.php.net/manual/fr/function.array-diff.php

相关内容

  • 没有找到相关文章

最新更新