Boşluğu nasıl patlatabilir ve kesebilirim?


167

Örneğin, bu dizedeki öğelerden bir dizi oluşturmak istiyorum:

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

Patlayabilir ve onlarla döngü ve kırpma biliyorum:

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

Ama bunun üstesinden gelebilecek tek bir yaklaşım varmış gibi hissediyorum. Herhangi bir fikir?

Yanıtlar:


449

Array_map kullanarak aşağıdakileri yapabilirsiniz :

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

10
Bu ayrıca PHP tarafından döngüsel olarak
Jason OOO

2
Bu .... kurtardı .... benim ... hayatım .... Bir dosyanın sonuna eklemek için fseek üzerinden bir dosyayı manipüle etmeye çalışıyordum ... bir dizi içine kırmak ve yeniden yazmaya karar verdim dosya, bütün zaman eklenen ekstra boşluk olduğunu gördüm ... bu + implode korkutucu hayatımı kurtardı .. Şimdi yemek yiyebilirim.
jenki221

4
@JasonOOO Çoğu insanın görüşüne göre, birkaç milisaniye (hatta bu bile) kısa, basit ve kolayca okunabilir bir kod satırına sahip olmak için adil bir ödünleşim olduğunu düşünüyorum.
Gavin

Basit ve kolay anlaşılır. Ancak, büyük veri kümeleriyle uğraşırsanız, @ amr-eladwy tarafından sağlanan daha yüksek performanslı cevap daha iyi çözümdür.
Yaron

i bu kod parçasını seviyorum ve şimdi ve sonra bu siteye geri gel!
patrickzzz

52

Geliştirilmiş cevap

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

Sonuç:

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

Bu

  • Yalnızca virgül üzerinde böler
  • Her öğeden beyaz boşlukları düzeltir.
  • Boş öğeleri yok sayar
  • "Yeşil şey" gibi dahili alanlara sahip bir öğeyi bölmez

7
Birisi bana bu cevabın neden 100 upvotes olmadığını açıklayabilir mi? Regexp'in anlaşılması zor, ancak 100Mb dosyamı diğer çözümlerden daha hızlı ayrıştırdı
Dan

2
Yararlı bulduğunuz için memnunum. Tüm cevapları okudum ve daha iyi bir karışımla geldim. Normal ifade ayrıntılı olarak açıklanabilir.
Amr ElAdawy

2
Üzgünüm ama bu düzenli ifade yanlıştır - deneyin değiştirilmesi redile *red*. Daha iyisi / (\ s *, \ s *) + /
Greg

@AmrElAdawy FYI 8/28 güncellemesinden sonra artık çalışmıyor. Yanıttaki normal ifade olduğu gibi, beyaz boşluk bazı elemanlardan kesilmez. Örn: “yeşil şey”.
Samsquanch

1
@Samsquanch güncellendi. Herhangi bir sorun görürseniz lütfen bize bildirin.
Amr ElAdawy

25

Aşağıdakiler ayrıca giriş dizesinin başlangıcında / sonunda beyaz boşluklarla ilgilenir:

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

ve bu, her mantıklı konumda beyaz boşluklarla minimal bir testtir:

$str = ' first , second , third , fourth, fifth ';
$new_arr = preg_split('/\s*,\s*/', trim($str));
var_export($str);

Yana array_mapregexp çözümleri aynı sonuçlar üretmek ve herkes onların performansını karşılaştırabilirsiniz?
Dan

@Dan Bu gibi durumlar için herhangi bir fark olmayacaktır.
Aris

4

tek bir kod satırında nasıl değiştirir ve patlarsınız

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

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

sonuçları şu şekilde çıktılar:

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

3

Mevcut cevaplardaki bazı prensipleri birleştirerek

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

Bunun arkasındaki gerekçe , dizenin sonunda bir virgül varsa dizide boş bir öğe döndüreceği bu cevapta bir hata bulduğumdur . yani

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

Sonuçları

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

Bu cevabı kaldırmak için bu cevapta belirtildiği gibi PREG_SPLIT_NO_EMPTY kullanarak düzeltebilirsiniz , ancak bunu yaptıktan sonra, düzenli olarak ardışık virgülleri, dolayısıyla kısaltılmış ifadeyi kaldırmaya teknik olarak gerek yoktur.


2

Bunu tek satırlık normal ifade ile de yapabilirsiniz

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

1

bunu dene:

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

OP bir dizi istiyor. preg_replace()bir dizeden dizi oluşturmaz. Bu yanlış soruya doğru cevap. Downvoted.
mickmackusa

1
$list = preg_split("/\s*,\s*/", 'red, green, blue ,orange');küçük değişiklik cevabı iyileştirir
dreftymac

1

ÖZELLİKLE eşleştirilecek her alt dize tek kelime olduğu OP'ın örnek dize için, kullanabileceğiniz str_word_count () .

Kod: ( Demo )

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

Çıktı:

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

Bu, karakter maskesinin / 3. parametresine gerekli karakterleri ekleyerek harflerin (ve bazı tire ve kesme işaretlerinin - ince baskıyı okursanız) alt dizeleri için de uyarlanabilir.

Kod: ( Demo )

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

Çıktı:

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

Yine, örnek dize nedeniyle bu soruyu çok dar bir şekilde ele alıyorum, ancak bu aynı istenen çıktıyı sağlayacaktır:

Kod: ( Demo )

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

0

Bunun için preg_split () kullanabilirsiniz .

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

/* Result:
  Array
  (
      [0] => red
      [1] => green
      [2] => blue
      [3] => orange
  )
 */

Bu, öğelerinizdeki boşluklara bölünecek
Chris KL

Virgülün gerekli olması için virgülleri kare parantezlerin soluna getirin.
Eric Leschinski

Virgülün sola kaydırılması sorunu çözmez. Lütfen aşağıdaki cevabımı kontrol et stackoverflow.com/a/38300330/5079380
Amr ElAdawy

-4
$str = str_replace(" ","", $str);

4
Trim bundan daha fazlasını yapıyor ... Aynı \t\n\r\0\x0Bzamanda düzeltir
Arian Faurtosh

3
Sadece bu değil, aynı zamanda elemanları boşlukla kaplayacak.
Adam Kiss

-11

kırp ve patla

$ str = 'kırmızı, yeşil, mavi, turuncu';

$ str = trim ($ str);

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

print_r ($ strArray);


5
Bu, yalnızca bir dizenin başından ve sonundan boşlukları ayırır, her renk arasında değil.
SeanWM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.