0

我有两个数组(在 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循环:

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

但这不是很好,因为它会尝试 0 到一个非常大的数字(在本例中为 99999)之间的每个索引。如何改进我的代码?

4

4 回答 4

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
}
于 2014-04-24T21:30:06.493 回答
1
foreach($arrayA as $k=>$a)
    if (!isset($arrayB[$k]))
        unset($arrayA[$k];
于 2014-04-24T21:29:40.393 回答
1

关于 PHP 数组需要注意的一件非常重要的事情是它们是关联的。您不能简单地使用 for 循环,因为索引不一定是整数范围。考虑一下如果你应用这个算法两次会发生什么!你会得到越界错误,$arrayA[2]并且$arrayB[2]不再存在!

foreach我会使用嵌套语句遍历数组。IE

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

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

于 2014-04-24T21:43:34.197 回答
-1

看看 php:array_diff

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

于 2014-04-24T21:29:06.323 回答