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?

Jawaban:


449

Anda dapat melakukan hal berikut menggunakan array_map :

$new_arr = array_map('trim', explode(',', $str));

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"

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);

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
)

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


2

Anda juga dapat melakukan ini dengan regex satu baris

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

1

coba ini:

$str = preg_replace("/\s*,\s*/", ",", 'red,     green,     blue ,orange');

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');

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
  )
 */

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


-11

trim dan meledak

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

$ str = trim ($ str);

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

print_r ($ strArray);


5
Ini hanya menghapus spasi dari awal dan akhir string, bukan di antara setiap warna.
SeanWM
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.