【问题标题】:Two PHP arrays, unset positions that are only present in one array两个 PHP 数组,未设置的位置仅存在于一个数组中
【发布时间】:2014-06-10 09:43:27
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    你要找的函数是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
    }
    

    【讨论】:

      【解决方案2】:

      关于 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=>value 对,如果键存在于两个原始数组中。

      【讨论】:

        【解决方案3】:
        foreach($arrayA as $k=>$a)
            if (!isset($arrayB[$k]))
                unset($arrayA[$k];
        

        【讨论】:

        • 如果你想要两者的共同点,你也可以使用 array_intersect。
        【解决方案4】:

        【讨论】:

        • array_diff 对值进行操作,OP 显然与键有关。
        • 我只希望人们阅读整个页面并找到其他相关功能!但是,是的,应该看起来 array_diff_assoc,或者更好,array_intersect_assoc。
        猜你喜欢
        • 2013-06-26
        • 2015-10-16
        • 2019-12-03
        • 1970-01-01
        • 1970-01-01
        • 2014-11-04
        • 2018-06-07
        • 2017-07-06
        • 1970-01-01
        相关资源
        最近更新 更多