在PHP中高效匹配数组的空元素
我有两个数组,$A和$B。两个数组的长度相同,但数组$A的非空元素数始终与$B相同,或者它的非空元素数少于$B 那么如果,在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","",""); 我目前正在通过以下代码执行此操作:
$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);