multidimensional keys array php implode

php - keys - ¿Cómo puedo implosionar una matriz mientras salteo elementos vacíos de la matriz?



php implode associative array (8)

Cómo debe implementar su filtro solo depende de lo que vea como "vacío".

function my_filter($item) { return !empty($item); // Will discard 0, 0.0, ''0'', '''', NULL, array() of FALSE // Or... return !is_null($item); // Will only discard NULL // or... return $item != "" && $item !== NULL; // Discards empty strings and NULL // or... whatever test you feel like doing } function my_join($array) { return implode(''-'',array_filter($array,"my_filter")); }

Perl''s join() ignora (omite) valores de matriz vacíos; La implode() de PHP implode() no parece.

Supongamos que tengo una matriz:

$array = array(''one'', '''', '''', ''four'', '''', ''six''); implode(''-'', $array);

rendimientos:

one---four--six

en lugar de (en mi humilde opinión, el preferible):

one-four-six

¿Algún otro built-in con el comportamiento que estoy buscando? ¿O va a ser un jobbie personalizado?


Para eliminar cadena null , false , empty pero conservar 0 , etc. use func. '' strlen ''

$arr = [null, false, "", 0, "0", "1", "2", "false"]; print_r(array_filter($arr, ''strlen''));

dará salida:

//Array ( [3] => 0 [4] => 0 [5] => 1 [6] => 2 [7] => false )


Prueba esto:

$result = array(); foreach($array as $row) { if ($row != '''') { array_push($result, $row); } } implode(''-'', $result);


Prueba esto:

if(isset($array)) $array = implode(",", (array)$array);


Puede usar array_filter() :

Si no se proporciona una devolución de llamada , se eliminarán todas las entradas de entrada igual a FALSE (ver conversión a booleano ).

implode(''-'', array_filter($array));

Obviamente, esto no funcionará si tiene 0 (o cualquier otro valor que se evalúe como false ) en su matriz y desea conservarlo. Pero luego puede proporcionar su propia función de devolución de llamada.


Según lo que puedo encontrar, diría que lo más probable es que no haya ninguna forma de usar un PHP integrado para eso. Pero probablemente puedas hacer algo similar a esto:

function implode_skip_empty($glue,$arr) { $ret = ""; $len = sizeof($arr); for($i=0;$i<$len;$i++) { $val = $arr[$i]; if($val == "") { continue; } else { $ret .= $arr.($i+1==$len)?"":$glue; } } return $ret; }


Supongo que no se puede considerar integrado (porque la función se está ejecutando con una función definida por el usuario), pero siempre se puede usar array_filter() .
Algo como:

function rempty ($var) { return !($var == "" || $var == null); } $string = implode(''-'',array_filter($array, ''rempty''));


array_fileter() parece ser la forma aceptada aquí, y probablemente todavía sea la respuesta más robusta tbh.

Sin embargo, lo siguiente también funcionará si puede garantizar que el carácter "pegamento" no existe en las cadenas de cada elemento de la matriz (lo cual sería un hecho en la mayoría de las circunstancias prácticas; de lo contrario, no podría distinguir el pegamento de los datos reales en la matriz):

$array = array(''one'', '''', '''', ''four'', '''', ''six''); $str = implode(''-'', $array); $str = preg_replace (''/(-)+/'', ''/1'', $str);