在PHP中高效匹配数组的空元素

在PHP中高效匹配数组的空元素,php,arrays,element,Php,Arrays,Element,我有两个数组,$A和$B。两个数组的长度相同,但数组$A的非空元素数始终与$B相同,或者它的非空元素数少于$B 那么如果, $B = array("john","adams","sandwich"); 那么$A可能是 $A = array("bacon","ham","juice"); 也可能是, $A = array("bacon","",""); 我试图将$B和$A的空元素进行匹配,这样我就可以 $B = array("john","",""); 我目前正在通过以下代码执行此操作:

我有两个数组,$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个元素,但由于某些原因,这仍然很耗时。

如果您正确理解了问题,那么您可能需要查找以下内容:

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


如果正确理解您的问题,那么您可能正在查找以下内容:

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


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

$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;
    }
}

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

$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;
    }
}

另一个简单的方法是将空项从$A替换为$B


另一个简单的方法是将空项从$A替换为$B

像这样

像这样吗?

试试这个

$c=array_diff($a,$b);
foreach($c as $key=>$val){
if($val=="")
    $b[$key]="";
}
希望它能起作用……

试试这个

$c=array_diff($a,$b);
foreach($c as $key=>$val){
if($val=="")
    $b[$key]="";
}
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); 

希望它能起作用…

非空元素总是在数组的开头吗?是的,非空元素总是在数组的开头。如果你只能使用其中一个,为什么要使用$i、$l、$q?第二,循环直到达到$l,数组元素之间将不匹配$q是为了找到数组的长度,该值将在每次脚本执行时更改$我要找出其中有多少是空的,这基本上告诉我需要移除多少。我只是用$I作为计数器。我也尝试过使用foreach方法而不使用任何索引,但这似乎更慢。非空元素总是在数组的开头吗?是的,非空元素总是在数组的开头。如果只能使用其中一个,为什么要使用$I、$l、$q?第二,循环直到达到$l,数组元素之间将不匹配$q是为了找到数组的长度,该值将在每次脚本执行时更改$我要找出其中有多少是空的,这基本上告诉我需要移除多少。我只是用$I作为计数器。我也尝试过使用foreach方法而不使用任何索引,但这似乎更慢。第一种方法非常有效,但不幸的是,当没有非空元素时,我会遇到问题。第二种方法我已经试过了,但似乎比运行while循环慢。第一种方法很好用,但不幸的是,当没有非空元素时,我会遇到问题。第二种方法我已经尝试过了,但似乎比运行while循环要慢。
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);