【问题标题】:Efficiently matching empty elements of arrays in PHP在 PHP 中有效匹配数组的空元素
【发布时间】:2012-08-16 05:52:00
【问题描述】:

我有两个数组,$A 和 $B。两个数组的长度相同,但数组 $A 将始终具有与 $B 相同数量的非空元素,或者它具有比 $B 更少的非空元素。

如果,

$B = array("john","adams","sandwich");

那么 $A 可能是,

$A = array("bacon","ham","juice");

也可能是,

$A = array("bacon","","");

我正在尝试将 $B 的空元素与 $A 匹配。所以我可以得到,

$B = array("john","","");

我目前正在通过以下代码进行操作:

$q = count($A) - 1;
$l = count($A) - count(array_filter($A));
$i = 1;
while($i <= $l){
    $B[$q] = "";
    $i++;
    $q--;
}

但是这种方法非常慢,考虑到我要多次这样做,可能会导致问题。你们对如何更有效地做到这一点有什么建议吗?数组永远不会超过 20 个元素,但出于某种原因,这仍然很耗时。

【问题讨论】:

  • 非空元素是否总是在数组的开头?
  • 是的,非空元素总是在开头。
  • 当你只能使用其中一个时,为什么还要使用$i, $l, $q?其次,循环直到到达$l 不会在数组元素之间“匹配”
  • $q 是求数组的长度(这个值会在每次脚本执行时改变)。 $l 是找出其中有多少是空的,这基本上告诉我需要删除多少。我只是使用 $i 作为计数器。我也尝试过使用 foreach() 方法而不使用任何索引,但这似乎更慢。

标签: php arrays element


【解决方案1】:

试试这个..

$c=array_diff($a,$b);
foreach($c as $key=>$val){
if($val=="")
    $b[$key]="";
}

希望它有效...

【讨论】:

    【解决方案2】:

    以下代码适用于所有情况,无论空值是否位于数组中的任何位置:

    $A = array('a', 'b', 'c');
    $B = array('', 'ab', 'zx');
    $B = array_filter($B, 'strlen');
    $B = array_filter($A, 'customfun');
    print_r($B);
    exit;
    function customfun($param) {
        global $A;
        global $B;
        $key = array_search($param, array_values($A));
        if(isset($B[$key])) {
            return true;
        } else {
            return false;
        }
    }
    

    【讨论】:

      【解决方案3】:

      另一种简单的方法是将$A 中的空项目(重新)放置到$B

      $B = array_replace($B, preg_grep('/^$/D', $A));
      

      【讨论】:

        【解决方案4】:

        如果正确理解您的问题,那么您可能正在寻找这个:

        $x = count(array_filter($A))
        $B = array_merge(array_slice($B,0,$x), array_fill(0,count($B)-$x,""))
        

        或者做

        foreach($B as $i => &$v)
            if($A[$i] == "")
                $v = ""
        

        【讨论】:

        • 第一种方法效果很好,但不幸的是,当没有非空元素时,我会遇到问题。第二种方法我已经尝试过了,但似乎比运行 while 循环要慢。
        【解决方案5】:
        <?php
        //test.php
        $b = array("john","adams","sandwich");
        $a = array("bacon","","");
        
        $length = count($a);
        
        for($lcv = 0; $lcv < $length; ++$lcv)
        {
            if($a[$lcv] == "")
            {
                $b[$lcv] = "";
            } 
        }
        
        ?>
        

        喜欢这样吗?

        【讨论】:

          【解决方案6】:
          function getArr($b,$a)
          {
              if($a === '')
              {
                  return '';
              }
              return $b;
          }
          $B = array("john","adams","sandwich");
          $A = array("bacon","","");
          print_r($A);
          $B = array_map('getArr',$B,$A);
          print_r($B); 
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-12-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-19
            • 1970-01-01
            相关资源
            最近更新 更多