Perl join()
mengabaikan (melewatkan) nilai array kosong; PHP implode()
tampaknya tidak.
Misalkan saya memiliki array:
$array = array('one', '', '', 'four', '', 'six');
implode('-', $array);
hasil:
one---four--six
daripada (IMHO lebih disukai):
one-four-six
Adakah bawaan lainnya dengan perilaku yang saya cari? Atau akan menjadi pekerja khusus?
join
tidak melewatkan elemen yang tidak ditentukan. Faktanya, mereka menghasilkan peringatan.$a[0]="a"; $a[2]="c"; say join "-",@a;
menampilkanUse of uninitialized value within @a in join or string
dana--c
. Satu dapat digunakanjoin '-', grep !defined, ...
untuk melewati nilai yang tidak ditentukan.grep !length,
akan melakukan string kosong.Jawaban:
Anda dapat menggunakan
array_filter()
:Jelas ini tidak akan berfungsi jika Anda memiliki
0
(atau nilai lain yang dievaluasi kefalse
) dalam larik Anda dan Anda ingin menyimpannya. Tapi kemudian Anda bisa menyediakan fungsi panggilan balik Anda sendiri.sumber
false
, dan0
juga dibuang?empty
, saat Anda menggunakannya, juga akan memperlakukan0
danfalse
sebagaifalse
(dan menghapusnya) btw.array_filter()
secara default menyaring setiapfalse
,,null
string kosong ('') dan0
.false
: larik kosong,0.0
dan"0"
.Saya kira Anda tidak dapat menganggapnya built in (karena fungsinya berjalan dengan fungsi yang ditentukan pengguna), tetapi Anda selalu dapat menggunakan array_filter .
Sesuatu seperti:
sumber
empty
memiliki efek yang sama dengan tidak meneruskan callback sama sekali. Edit: Anda harus meniadakan nilai yang dikembalikan. Jika tidak, hanya elemen kosong yang akan dikembalikan;) (sebenarnya menggunakanempty
seperti yang Anda lakukan sebelumnya juga salah)implode('-', array_filter($ary, create_function('$a', 'return $a!="";')));
Bagaimana Anda harus menerapkan filter Anda hanya bergantung pada apa yang Anda lihat sebagai "kosong".
sumber
Untuk menghapus
null
,false
,empty
string tetapi melestarikan0
, dll penggunaan func. 'strlen
'akan mengeluarkan:
sumber
Berdasarkan apa yang dapat saya temukan, menurut saya kemungkinan besar, sebenarnya tidak ada cara untuk menggunakan PHP bawaan untuk itu. Tetapi Anda mungkin bisa melakukan sesuatu seperti ini:
sumber
Coba ini:
sumber
Kembali
one-two-three
sumber
array_fileter()
tampaknya cara yang diterima di sini, dan mungkin masih merupakan jawaban yang paling kuat tbh.Namun, hal berikut juga akan berfungsi jika Anda dapat menjamin bahwa karakter "perekat" belum ada di string setiap elemen array (yang akan diberikan dalam keadaan paling praktis - jika tidak, Anda tidak akan dapat membedakan lem dari data aktual dalam larik):
sumber
Coba ini:
sumber
isset()
atau mentransmisikan array input sebagaiarray
alamat salah satu kekhawatiran dari posting asli?