这里是一个解决方案,应输出新索引数组。
$result = array_deflate(explode($delim, $array));
function array_deflate($arr, $emptyval=''){
$ret=[];
for($i=0,$L=count($arr); $i<$L; ++$i)
if($arr[$i] !== $emptyval) $ret[]=$arr[$i];
return $ret;
}
尽管与其他一些建议非常相似,但该实现具有通用性。对于包含非字符串元素的数组,请提供一个类型化的空值作为第二个参数。
array_deflate($objArray, new stdClass());
array_deflate($databaseArray, NULL);
array_deflate($intArray, NULL);
array_deflate($arrayArray, []);
array_deflate($assocArrayArray, [''=>NULL]);
array_deflate($processedArray, new Exception('processing error'));
。
。
。
使用可选的过滤器参数..
function array_deflate($arr, $trigger='', $filter=NULL, $compare=NULL){
$ret=[];
if ($filter === NULL) $filter = function($el) { return $el; };
if ($compare === NULL) $compare = function($a,$b) { return $a===$b; };
for($i=0,$L=count($arr); $i<$L; ++$i)
if(!$compare(arr[$i],$trigger)) $ret[]=$arr[$i];
else $filter($arr[$i]);
return $ret;
}
随着使用..
function targetHandler($t){ /* .... */ }
array_deflate($haystack, $needle, targetHandler);
车削array_deflate成处理的选择元件的方式和从阵列中除去它们。更好的方法是把if语句变成一个比较函数,这个函数也可以作为一个参数传递,以防你喜欢。
array_inflate
是相反的,因为匹配的第一个参数被推送到非匹配被过滤,所以需要一个额外的数组。
function array_inflate($dest,$src,$trigger='', $filter=NULL, $compare=NULL){
if ($filter === NULL) $filter = function($el) { return $el; };
if ($compare === NULL) $compare = function($a,$b) { return $a===$b; };
for($i=0,$L=count($src); $i<$L; ++$i)
if($compare(src[$i],$trigger)) $dest[]=$src[$i];
else $filter($src[$i]);
return $dest;
}
随着使用..
$smartppl=[];
$smartppl=array_inflate($smartppl,
$allppl,
(object)['intelligence'=>110],
cureStupid,
isSmart);
function isSmart($a,$threshold){
if(isset($a->intellgence)) //has intelligence?
if(isset($threshold->intellgence)) //has intelligence?
if($a->intelligence >= $threshold->intelligence)
return true;
else return INVALID_THRESHOLD; //error
else return INVALID_TARGET; //error
return false;
}
function cureStupid($person){
$dangerous_chemical = selectNeurosteroid();
applyNeurosteroid($person, $dangerous_chemical);
if(isSmart($person,(object)['intelligence'=>110]))
return $person;
else
lobotomize($person);
return $person;
}
从而为全球教育问题的理想算法。 Aaand我会在我把它变成别的东西之前停下来。
我认为这是最正确的,因为它维护正确的数组索引。 – 2008-09-15 17:18:59
@Ryono:你究竟是什么意思? – 2008-10-30 15:17:45
preg_split将返回一个具有顺序数组索引的数组(即0,1,2,3)。其他一些使用array_filter的建议将会返回非连续的数组索引,因为一些元素被过滤掉了,并且剩下像0,1,3,7这样的数组索引。 – 2009-08-18 16:23:50