Bagaimana saya bisa meledak dan memotong spasi?

167

Sebagai contoh, saya ingin membuat array dari elemen-elemen dalam string ini:

$str = 'red,     green,     blue ,orange';

Saya tahu Anda bisa meledak dan memutarnya:

$arr = explode(',', $str);
foreach ($arr as $value) {
    $new_arr[] = trim($value);
}

Tapi saya merasa ada pendekatan satu garis yang bisa menangani ini. Ada ide?

SeanWM
sumber

Jawaban:

449

Anda dapat melakukan hal berikut menggunakan array_map :

$new_arr = array_map('trim', explode(',', $str));
SeanWM
sumber
10
Ini juga perulangan (secara internal) oleh PHP
Jason OOO
2
this .... save .... my ... life .... Saya mencoba memanipulasi file via fseek untuk ditambahkan ke akhir file ... setelah saya memutuskan untuk memecahnya menjadi sebuah array dan menulis ulang file, saya melihat bahwa ada ruang putih tambahan yang ditambahkan sepanjang waktu ... + ledakan ini menyelamatkan hidupku yang menakutkan .. aku bisa makan makanan sekarang.
jenki221
4
@JasonOOO Saya pikir menurut pendapat kebanyakan orang, beberapa milidetik (bahkan jika itu) adalah tradeoff yang adil untuk memiliki garis kode yang pendek, sederhana dan mudah dibaca.
Gavin
Sederhana dan mudah dimengerti. Namun, jika berurusan dengan set data besar, jawaban yang lebih berkinerja yang diberikan oleh @ amr-eladwy adalah solusi yang lebih baik.
Yaron
Saya suka potongan kode ini dan kembali ke situs ini sekarang dan nanti!
patrickzzz
52

Jawaban yang ditingkatkan

preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red,     green thing ,,  ,,   blue ,orange');

Hasil:

Array
(
    [0] => red
    [1] => green thing
    [2] => blue
    [3] => orange
)

Ini

  • Pisahkan hanya dengan koma
  • Memotong spasi putih dari setiap item.
  • Abaikan barang kosong
  • Tidak membagi item dengan ruang internal seperti "benda hijau"
Amr ElAdawy
sumber
7
Adakah yang bisa menjelaskan mengapa jawaban ini tidak memiliki 100 upvotes? Regexp sulit dimengerti, tetapi mem-parsing file 100Mb saya lebih cepat daripada solusi lain
Dan
2
Saya senang Anda merasa terbantu. Saya membaca semua jawaban dan datang dengan campuran yang lebih baik. Regex dapat dijelaskan secara rinci.
Amr ElAdawy
2
Maaf tapi regex ini salah - coba ganti reddengan *red*. Yang lebih baik mungkin / (\ s *, \ s *) + /
Greg
@AmrElAdawy FYI ini tidak lagi berfungsi setelah pembaruan 8/28. Dengan regex dalam jawaban apa adanya, ruang putih tidak dipangkas dari beberapa elemen. Mis: `benda hijau`.
Samsquanch
1
@Samsquanch diperbarui. Tolong beri tahu saya jika Anda melihat ada masalah.
Amr ElAdawy
25

Berikut ini juga menangani spasi putih di awal / akhir string input:

$new_arr = preg_split('/\s*,\s*/', trim($str));

dan ini adalah tes minimal dengan spasi putih di setiap posisi yang masuk akal:

$str = ' first , second , third , fourth, fifth ';
$new_arr = preg_split('/\s*,\s*/', trim($str));
var_export($str);
Diego Perini
sumber
Karena array_mapdan solusi regexp menghasilkan hasil yang identik, dapatkah orang membandingkan kinerja mereka?
Dan
@Dan Untuk kasus seperti ini, tidak akan ada perbedaan.
Aris
4

ini cara Anda mengganti dan meledak dalam satu baris kode

$str = 'red,     green,     blue ,orange';

$new_string = explode(',',preg_replace('/\s+/', '', $str));

akan menampilkan hasilnya sebagai

Array
(
    [0] => red
    [1] => green
    [2] => blue
    [3] => orange
)
Amit Sharma
sumber
3

Dengan menggabungkan beberapa kepala sekolah dalam jawaban yang ada saya datang dengan

preg_split ('/\s*,+\s*/', 'red,     green thing ,,  ,,   blue ,orange', NULL, PREG_SPLIT_NO_EMPTY);

Alasan di baliknya adalah bahwa saya menemukan bug dalam jawaban ini , di mana jika ada koma di akhir string itu akan mengembalikan elemen kosong dalam array. yaitu

preg_split ('/(\s*,*\s*)*,+(\s*,*\s*)*/', 'red,     green thing ,,  ,,   blue ,orange,');

Hasil dalam

Array
(
  [0] => red
  [1] => green thing
  [2] => blue
  [3] => orange
  [4] => ''
)

Anda dapat memperbaikinya dengan menggunakan PREG_SPLIT_NO_EMPTY sebagaimana disebutkan dalam jawaban ini untuk menghapusnya, tetapi begitu Anda melakukannya, secara teknis tidak perlu menghapus koma berturut-turut melalui regex, sehingga ekspresi yang dipersingkat

shmurf
sumber
2

Anda juga dapat melakukan ini dengan regex satu baris

preg_split('@(?:\s*,\s*|^\s*|\s*$)@', $str, NULL, PREG_SPLIT_NO_EMPTY);
Dom
sumber
1

coba ini:

$str = preg_replace("/\s*,\s*/", ",", 'red,     green,     blue ,orange');
Jason OOO
sumber
OP menginginkan sebuah array. preg_replace()tidak menghasilkan array dari string. Ini adalah jawaban yang benar untuk pertanyaan yang salah. Diturunkan.
mickmackusa
1
$list = preg_split("/\s*,\s*/", 'red, green, blue ,orange');modifikasi kecil merehabilitasi jawabannya
dreftymac
1

KHUSUS untuk string sampel OP, karena setiap substring yang akan dicocokkan adalah satu kata, Anda dapat menggunakan str_word_count () .

Kode: ( Demo )

$str = ' red,     green,     blue ,orange ';
var_export(str_word_count($str,1));  // 1 means return all words in an indexed array

Keluaran:

array (
  0 => 'red',
  1 => 'green',
  2 => 'blue',
  3 => 'orange',
)

Ini juga dapat disesuaikan untuk substring di luar huruf (dan beberapa tanda hubung dan apostrof - jika Anda membaca cetakan halus) dengan menambahkan karakter yang diperlukan ke karakter topeng / parameter ke-3.

Kode: ( Demo )

$str = " , Number1 ,     234,     0 ,4heaven's-sake  ,  ";
var_export(str_word_count($str,1,'0..9'));

Keluaran:

array (
  0 => 'Number1',
  1 => '234',
  2 => '0',
  3 => '4heaven\'s-sake',
)

Sekali lagi, saya memperlakukan pertanyaan ini dengan sangat sempit karena string sampel, tetapi ini akan memberikan hasil yang diinginkan sama:

Kode: ( Demo )

$str = ' red,     green,     blue ,orange ';
var_export(preg_match_all('/[^, ]+/',$str,$out)?$out[0]:'fail');
mickmackusa
sumber
0

Anda dapat menggunakan preg_split () untuk itu.

$bar = preg_split ('/[,\s]+/', $str);
print_r ($bar);

/* Result:
  Array
  (
      [0] => red
      [1] => green
      [2] => blue
      [3] => orange
  )
 */
Sutandiono
sumber
Itu akan terpecah pada spasi di elemen Anda
Chris KL
Pindahkan koma ke kiri dari kawat gigi persegi untuk membuat koma diperlukan.
Eric Leschinski
Memindahkan koma ke kiri tidak akan menyelesaikannya. Silakan periksa jawaban saya di bawah ini stackoverflow.com/a/38300330/5079380
Amr ElAdawy
-4
$str = str_replace(" ","", $str);
Putih hitam
sumber
4
Trim melakukan lebih dari ini ... Trim \t\n\r\0\x0Bjuga
Arian Faurtosh
3
Bukan hanya itu, tetapi ini akan mengacaukan elemen dengan ruang.
Adam Kiss
-11

trim dan meledak

$ str = 'merah, hijau, biru, oranye';

$ str = trim ($ str);

$ strArray = meledak (',', $ str);

print_r ($ strArray);

Anil M Saini
sumber
5
Ini hanya menghapus spasi dari awal dan akhir string, bukan di antara setiap warna.
SeanWM