Perl join()
ignoruje (pomija) puste wartości tablicowe; PHPimplode()
nie wydaje się.
Załóżmy, że mam tablicę:
$array = array('one', '', '', 'four', '', 'six');
implode('-', $array);
plony:
one---four--six
zamiast (preferowane IMHO):
one-four-six
Czy są jakieś inne wbudowane funkcje, których szukam? A może będzie to niestandardowy pracownik?
join
nie pomija niezdefiniowanych elementów. W rzeczywistości skutkują ostrzeżeniem.$a[0]="a"; $a[2]="c"; say join "-",@a;
wyświetlaczeUse of uninitialized value within @a in join or string
ia--c
. Można użyćjoin '-', grep !defined, ...
do pominięcia niezdefiniowanych wartości.grep !length,
zrobi puste łańcuchy.Odpowiedzi:
Możesz użyć
array_filter()
:implode('-', array_filter($array));
Oczywiście to nie zadziała, jeśli masz
0
(lub jakąkolwiek inną wartość, której wynikiem jestfalse
) w swojej tablicy i chcesz ją zachować. Ale wtedy możesz udostępnić własną funkcję wywołania zwrotnego.źródło
false
, a0
także zostałyby wyrzucone?empty
, jak go używasz, będzie również traktować0
ifalse
jakofalse
(i usuwać) btw.array_filter()
przez filtry domyślnie wyłączone każdyfalse
,null
, pusty ciąg ( „”) oraz0
.false
: pusta tablica0.0
i"0"
.Przypuszczam, że nie można traktować tego jako wbudowanego (ponieważ funkcja działa z funkcją zdefiniowaną przez użytkownika), ale zawsze można użyć array_filter .
Coś jak:
function rempty ($var) { return !($var == "" || $var == null); } $string = implode('-',array_filter($array, 'rempty'));
źródło
empty
ma taki sam efekt, jak przekazywanie żadnego wywołania zwrotnego. Edycja: Musisz zanegować wartość zwracaną. W przeciwnym razie zostaną zwrócone tylko puste elementy;) (użycieempty
tak jak wcześniej było również błędne)implode('-', array_filter($ary, create_function('$a', 'return $a!="";')));
Sposób implementacji filtru zależy tylko od tego, co widzisz jako „puste”.
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")); }
źródło
Aby usunąć
null
,false
,empty
ciąg, ale zachować0
itd użytkowania func. 'strlen
'$arr = [null, false, "", 0, "0", "1", "2", "false"]; print_r(array_filter($arr, 'strlen'));
wyświetli:
//Array ( [3] => 0 [4] => 0 [5] => 1 [6] => 2 [7] => false )
źródło
Na podstawie tego, co mogę znaleźć, powiedziałbym, że są szanse, tak naprawdę nie ma sposobu, aby użyć wbudowanego PHP do tego. Ale prawdopodobnie mógłbyś zrobić coś w ten sposób:
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; }
źródło
Spróbuj tego:
$result = array(); foreach($array as $row) { if ($row != '') { array_push($result, $row); } } implode('-', $result);
źródło
$array = ["one", NULL, "two", NULL, "three"]; $string = implode("-", array_diff($array, [NULL])); echo $string;
Zwroty
one-two-three
źródło
array_fileter()
wydaje się być tutaj akceptowanym sposobem i prawdopodobnie nadal jest najbardziej solidną odpowiedzią tbh.Jednak poniższe będzie również działać, jeśli możesz zagwarantować, że znak „klej” nie istnieje już w łańcuchach każdego elementu tablicy (który byłby podany w większości praktycznych okoliczności - w przeciwnym razie nie byłbyś w stanie odróżnić klej z rzeczywistych danych w tablicy):
$array = array('one', '', '', 'four', '', 'six'); $str = implode('-', $array); $str = preg_replace ('/(-)+/', '\1', $str);
źródło
Spróbuj tego:
if(isset($array)) $array = implode(",", (array)$array);
źródło
isset()
lub rzutowanie tablicy wejściowej jest odpowiedzią naarray
którekolwiek z obaw oryginalnego postu?