Come posso esplodere e tagliare gli spazi bianchi?


167

Ad esempio, vorrei creare un array dagli elementi di questa stringa:

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

So che puoi esplodere, attraversarli e tagliare:

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

Ma sento che esiste un approccio a una linea che può gestirlo. Qualche idea?

Risposte:


449

Puoi fare quanto segue usando array_map :

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

10
Anche questo è in loop (internamente) da PHP
Jason OOO,

2
questo .... salvato .... la mia ... vita .... stavo provando a manipolare un file tramite fseek per aggiungerlo alla fine di un file ... una volta che ho deciso di romperlo in un array e riscrivere il file, ho visto che c'era spazio aggiuntivo aggiunto tutto il tempo ... questo + implode mi ha salvato la vita da impazzire .. Ora posso andare a mangiare cibo.
jenki221

4
@JasonOOO Penso che l'opinione della maggior parte delle persone, un paio di millisecondi (se anche quello) è un giusto compromesso per avere una riga di codice che è breve, semplice e facilmente leggibile.
Gavin,

Semplice e facile da capire Tuttavia, se si ha a che fare con set di dati di grandi dimensioni, la risposta più efficace fornita da @ amr-eladwy è la soluzione migliore.
Yaron,

Adoro questo pezzo di codice e tornare a questo sito di tanto in tanto!
patrickzzz,

52

Una risposta migliorata

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

Risultato:

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

Questo

  • Si divide solo su virgole
  • Taglia gli spazi bianchi da ciascun elemento.
  • Ignora gli oggetti vuoti
  • Non divide un oggetto con spazi interni come "cosa verde"

7
Qualcuno può spiegarmi perché questa risposta non ha 100 voti? Regexp è difficile da capire, ma ha analizzato il mio file da 100 Mb più velocemente di altre soluzioni
Dan

2
Sono contento che tu l'abbia trovato utile. Ho letto tutte le risposte e sono arrivato con un mix migliore. Il regex può essere spiegato in dettaglio.
Amr ElAdawy,

2
Siamo spiacenti ma questa regex è sbagliata: prova a sostituirla redcon *red*. Uno migliore potrebbe essere / (\ s *, \ s *) + /
Greg

@AmrElAdawy FYI questo non funziona più dopo l'aggiornamento 8/28. Con la regex nella risposta così com'è, lo spazio bianco non viene tagliato da alcuni degli elementi. Es: "cosa verde".
Samsquanch,

1
@Samsquanch aggiornato. Per favore fatemi sapere se vedete qualche problema.
Amr ElAdawy,

25

Quanto segue si occupa anche degli spazi bianchi all'inizio / alla fine della stringa di input:

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

e questo è un test minimo con spazi bianchi in ogni posizione sensibile:

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

Dal momento che array_mape le soluzioni regexp producono risultati identici, qualcuno potrebbe confrontare le loro prestazioni?
Dan,

@Dan Per casi come questo, non farà alcuna differenza.
Aris,

4

in questo modo sostituisci ed esplodi in una singola riga di codice

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

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

produrrà i risultati come

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

3

Combinando alcuni dei principi nelle risposte esistenti che ho trovato

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

Il ragionamento dietro è che ho trovato un bug in questa risposta , dove se c'è una virgola alla fine della stringa restituirà un elemento vuoto nella matrice. vale a dire

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

Risultati in

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

È possibile risolvere questo problema utilizzando PREG_SPLIT_NO_EMPTY come indicato in questa risposta per rimuoverlo, ma una volta fatto ciò non è tecnicamente necessario rimuovere le virgole consecutive tramite regex, quindi l'espressione abbreviata


2

Puoi anche farlo con una regex a una riga

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

1

prova questo:

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

L'OP vuole un array. preg_replace()non genera un array da una stringa. Questa è la risposta giusta alla domanda sbagliata. Downvoted.
Mickmackusa,

1
$list = preg_split("/\s*,\s*/", 'red, green, blue ,orange');modifiche minori riabilitano la risposta
dreftymac,

1

SPECIFICAMENTE per la stringa di esempio dell'OP, poiché ogni sottostringa da abbinare è una singola parola, è possibile utilizzare str_word_count () .

Codice: ( Demo )

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

Produzione:

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

Questo può anche essere adattato per sottostringhe oltre le lettere (e alcuni trattini e apostrofi - se leggi la stampa fine) aggiungendo i caratteri necessari alla maschera di caratteri / 3 ° parametro.

Codice: ( Demo )

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

Produzione:

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

Ancora una volta, sto trattando questa domanda molto strettamente a causa della stringa di esempio, ma questo fornirà lo stesso risultato desiderato:

Codice: ( Demo )

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

0

Puoi usare preg_split () per questo.

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

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

Questo si dividerà sugli spazi nei tuoi elementi
Chris KL,

Spostare la virgola a sinistra delle parentesi quadre per rendere necessaria la virgola.
Eric Leschinski,

Spostare la virgola a sinistra non lo risolverà. Si prega di controllare la mia risposta qui sotto stackoverflow.com/a/38300330/5079380
Amr ElAdawy


-11

tagliare ed esplodere

$ str = 'rosso, verde, blu, arancione';

$ str = trim ($ str);

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

print_r ($ strArray);


5
Questo rimuove solo gli spazi bianchi dall'inizio e dalla fine di una stringa, non tra ciascun colore.
SeanWM,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.