Aquí es una solución que debe ser la salida de un arreglo recientemente indexada.
$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;
}
Aunque es bastante similar a otra sugerencia, esta implementación tiene el beneficio del uso genérico. Para matrices con elementos que no sean de cadena, proporcione un valor vacío tipado como segundo argumento.
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'));
.
.
.
Con un argumento filtro opcional ..
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;
}
Con el uso ..
function targetHandler($t){ /* .... */ }
array_deflate($haystack, $needle, targetHandler);
Volviendo array_deflate en una forma de elementos de elección de procesamiento y sacarlos de su matriz. También es más agradable convertir la instrucción if en una función de comparación que también se pasa como argumento en caso de que te apetezca.
array_inflate
siendo al revés, tomaría una matriz adicional ya que el primer parámetro que coincide se inserta mientras que las no coincidencias se filtran.
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;
}
Con el uso ..
$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;
}
lo tanto proporcionar un algoritmo ideal para los problemas educativos del mundo. Y me detendré allí antes de modificar esto en otra cosa ...
Creo que este es el más correcto porque mantiene los índices de matriz correctos. –
@Ryono: ¿qué quieres decir con eso, exactamente? –
preg_split devolverá una matriz con índices de matriz secuencial, (es decir, 0, 1, 2, 3). Algunas de las otras sugerencias que usan array_filter devolverán índices de matriz no secuenciales porque algunos elementos se filtran y le quedan índices de matriz como 0,1,3,7. –