explode

(PHP 4, PHP 5)

explodeРазбивает строку с помощью разделителя

Описание

array explode ( string $delimiter , string $string [, int $limit ] )

Возвращает массив строк, полученных разбиением строки string с использованием delimiter в качестве разделителя.

Список параметров

delimiter

Разделитель.

string

Входная строка.

limit

Если аргумент limit является положительным, возвращаемый массив будет содержать максимум limit элементов, при этом последний элемент будет содержать остаток строки string.

Если параметр limit отрицателен, то будут возвращены все компоненты кроме последних -limit.

Если limit равен нулю, то он расценивается как 1.

По историческим причинам, функции implode() можно передавать аргументы в любом порядке, но для explode() это недопустимо. Убедитесь в том, что delimiter указан перед аргументом string.

Возвращаемые значения

Возвращает массив (array) строк (string), созданный делением параметра string по границам, указанным параметром delimiter.

Если delimiter является пустой строкой (""), explode() возвращает FALSE. Если delimiter не содержится в string, и используется отрицательный limit, то будет возвращен пустой массив (array), иначе будет возвращен массив, содержащий string.

Список изменений

Версия Описание
5.1.0 Добавлена поддержка отрицательных значений limit
4.0.1 Добавлен параметр limit

Примеры

Пример #1 Пример использования explode()

<?php
// Пример 1
$pizza  "кусок1 кусок2 кусок3 кусок4 кусок5 кусок6";
$pieces explode(" "$pizza);
echo 
$pieces[0]; // кусок1
echo $pieces[1]; // кусок2

// Пример 2
$data "foo:*:1023:1000::/home/foo:/bin/sh";
list(
$user$pass$uid$gid$gecos$home$shell) = explode(":"$data);
echo 
$user// foo
echo $pass// *

?>

Пример #2 Примеры с использованием параметра limit

<?php
$str 
'один|два|три|четыре';

// положительный лимит
print_r(explode('|'$str2));

// отрицательный лимит (начиная с PHP 5.1)
print_r(explode('|'$str, -1));
?>

Результат выполнения данного примера:

Array
(
    [0] => один
    [1] => два|три|четыре
)
Array
(
    [0] => один
    [1] => два
    [2] => три
)

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Смотрите также

  • preg_split() - Разбивает строку по регулярному выражению
  • str_split() - Преобразует строку в массив
  • mb_split() - Разделение строк в многобайтных кодировках, используя регулярное выражение
  • str_word_count() - Возвращает информацию о словах, входящих в строку
  • strtok() - Разбивает строку на токены
  • implode() - Объединяет элементы массива в строку

Коментарии

To split a string containing multiple seperators between elements rather use preg_split than explode:

preg_split ("/\s+/", "Here  are    to    many  spaces in   between");

which gives you
array ("Here", "are", "to", "many", "spaces", "in", "between");
2003-11-16 10:01:29
http://php5.kiev.ua/manual/ru/function.explode.html
Note that explode, split, and functions like it, can accept more than a single character for the delimiter.

<?php
$string 
"Something--next--something else--next--one more";

print_r(explode('--next--',$string));
?>
2006-12-09 21:49:00
http://php5.kiev.ua/manual/ru/function.explode.html
Автор:
Keep in mind that explode() can return empty elements if the delimiter is immediately repeated twice (or more), as shown by the following example:

<?php
$foo 
'uno dos  tres'// two spaces between "dos" and "tres"
print_r(explode(' '$foo));
?>

Array
(
    [0] => uno
    [1] => dos
    [2] => 
    [3] => tres
)

Needless to say this is definitely not intuitive and must be handled carefully.
2009-04-21 10:50:55
http://php5.kiev.ua/manual/ru/function.explode.html
Автор:
<?php
// converts pure string into a trimmed keyed array
function string2KeyedArray($string$delimiter ','$kv '=>') {
  if (
$a explode($delimiter$string)) { // create parts
   
foreach ($a as $s) { // each part
     
if ($s) {
        if (
$pos strpos($s$kv)) { // key/value delimiter
         
$ka[trim(substr($s0$pos))] = trim(substr($s$pos strlen($kv)));
        } else { 
// key delimiter not found
         
$ka[] = trim($s);
        }
      }
    }
    return 
$ka;
  }
// string2KeyedArray

$string 'a=>1, b=>23   , $a, c=> 45% , true,d => ab c ';
print_r(string2KeyedArray($string));
?>

Array
(
  [a] => 1
  [b] => 23
  [0] => $a
  [c] => 45%
  [1] => true
  [d] => ab c
)
2009-09-02 22:18:59
http://php5.kiev.ua/manual/ru/function.explode.html
Автор:
Note to the previous example: we can do the whole string->array conversion using explode() exclusively. 

<?php
   
// converts pure string into a trimmed keyed array
   
function string_2_array$string$delimiter ','$kv '=>')
    {
        if (
$element explode$delimiter$string ))
        {
           
// create parts
           
foreach ( $element as $key_value )
            {
               
// key -> value pair or single value
               
$atom explode$kv$key_value );

                if( 
trim($atom[1]) )
                {
                 
$key_arr[trim($atom[0])] = trim($atom[1]);
                }
                else
                {
                   
$key_arr[] = trim($atom[0]);
                }
            }
        }
        else
        {
           
$key_arr false;
        }

        return 
$key_arr;
    }
?>
2009-09-28 18:20:42
http://php5.kiev.ua/manual/ru/function.explode.html
My application was running out of memory (my hosting company limits PHP to 32MB).  I have a string containing between 100 and 20000 triplets, separated by a space, with each triplet consisting of three double-precision numbers, separated by commas.  Total size of the biggest string, with 20000 triplets, is about 1MB.

The application needs to split the string into triplets, then split the triplet into numbers.  In C, this would take up about 480K (20000 times 3 x 8 bytes) for the final array.  The intermediate array of strings shouldn't be much bigger than the long string itself (1MB).  And I expect some overhead from PHP, say 300% to allow for indexes etc.

Well, PHP5 manages to run out of memory *at the first stage* (exploding the string on the space character).  I'm expecting to get an array of 20000 strings, but it needs more than 32MB to store it.  Amazing.

The workaround was easy and had the bonus of producing faster code (I compared it on a 10000 triplet string).  Since in any case I had to split up the numeric triplets afterwards, I decided to use preg_match_all() on the original string.  Despite the fact that the resulting "matches" array contains more data per element than the result of explode() - because it stores the matched triplet, plus its component numbers - it takes up far less memory.

Moral: be careful when using explode() on big strings, as it can also explode your memory usage.
2009-10-14 18:47:32
http://php5.kiev.ua/manual/ru/function.explode.html
That with all stateful encodings that use bytes between 0x00 and 0x7f for something other than, say, encoding ASCII characters. Including GBK, BIG5, Shift-JIS etc.

explode and other such PHP functions work on bytes, not characters.

What you do is to convert the string to UTF-8 using iconv(), then explode, then go back to GBK.
2010-04-08 12:02:46
http://php5.kiev.ua/manual/ru/function.explode.html
Here's a function for "multi" exploding a string.

<?php
//the function
//Param 1 has to be an Array
//Param 2 has to be a String
function multiexplode ($delimiters,$string) {
   
$ary explode($delimiters[0],$string);
   
array_shift($delimiters);
    if(
$delimiters != NULL) {
        foreach(
$ary as $key => $val) {
             
$ary[$key] = multiexplode($delimiters$val);
        }
    }
    return 
$ary;
}

// Example of use
$string "1-2-3|4-5|6:7-8-9-0|1,2:3-4|5";
$delimiters = Array(",",":","|","-");

$res multiexplode($delimiters,$string);
echo 
'<pre>';
print_r($res);
echo 
'</pre>';

//returns
/*
Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [0] => 1
                            [1] => 2
                            [2] => 3
                        )

                    [1] => Array
                        (
                            [0] => 4
                            [1] => 5
                        )

                    [2] => Array
                        (
                            [0] => 6
                        )

                )

            [1] => Array
                (
                    [0] => Array
                        (
                            [0] => 7
                            [1] => 8
                            [2] => 9
                            [3] => 0
                        )

                    [1] => Array
                        (
                            [0] => 1
                        )

                )

        )

    [1] => Array
        (
            [0] => Array
                (
                    [0] => Array
                        (
                            [0] => 2
                        )

                )

            [1] => Array
                (
                    [0] => Array
                        (
                            [0] => 3
                            [1] => 4
                        )

                    [1] => Array
                        (
                            [0] => 5
                        )

                )

        )

)
*/
?>
2010-07-31 10:02:50
http://php5.kiev.ua/manual/ru/function.explode.html
Автор:
I'm sure you guys get just a bit frustrated at times when you need a fraction of a very simple string and you use "explode()", but then you have to define a whole extra variable. (That is because you need to store a function-returned array in a variable before you can extract a value).

If you're extracting the last half, or third, of a string, there's an easy inline workaround. Check this:

<?php
 $mystr 
"separated-text";
 print(
str_replace("-","",strstr("-",$mystr)));
 
//Returns "text"
?>

If the separator (dash) can be left in, you don't even need the "str_replace()" function.

Lets try this with 3 fractions:

<?php
 $mystr 
"separated-text-again";
 
//Comment submission wouldn't let me
 // combine this into one statement.
 // That's okay, it's more readable.
 
$split1 str_replace("-","",strstr("-",$mystr));
 print(
str_replace("-","",strstr("-",$split1)));
 
//Returns "again"
?>

Anything more than 3 fractions gets really confusing, in that case you should use "explode()".

Hope this helps!
~Cody G.
2010-08-08 09:41:19
http://php5.kiev.ua/manual/ru/function.explode.html
Beaware splitting empty strings.

<?php
$str 
"";
$res explode(","$str);
print_r($res);
?>

If you split an empty string, you get back a one-element array with 0 as the key and an empty string for the value.

Array
(
    [0] => 
)

To solve this, just use array_filter() without callback. Quoting manual page "If the callback function is not supplied, array_filter() will remove all the entries of input that are equal to FALSE.".

<?php
$str 
"";
$res array_filter(explode(","$str));
print_r($res);
?>

Array
(
)
2010-09-09 06:40:14
http://php5.kiev.ua/manual/ru/function.explode.html
Автор:
A one-liner to extract a portion of a string, starting from the END of the string....
<?php
$extracted_string 
implode('.'array_slice(explode('.'$original_string), -2));
?>
2010-12-30 11:21:09
http://php5.kiev.ua/manual/ru/function.explode.html
a simple one line method to explode & trim whitespaces from the exploded elements

array_map('trim',explode(",",$str));

example:

$str="one  ,two  ,       three  ,  four    "; 
print_r(array_map('trim',explode(",",$str)));

Output:

Array ( [0] => one [1] => two [2] => three [3] => four )
2011-05-30 03:32:45
http://php5.kiev.ua/manual/ru/function.explode.html
Explode does not parse a string by delimiters, in the sense that we expect to find tokens between a starting and ending delimiter, but instead splits a string into parts by using a string as the boundary of each part. Once that boundary is discovered the string is split. Whether or not that boundary is proceeded or superseded by any data is irrelevant since the parts are determined at the point a boundary is discovered. 

For example: 

<?php 

var_dump
(explode("/","/")); 

/* 
   Outputs 

   array(2) { 
     [0]=> 
     string(0) "" 
     [1]=> 
     string(0) "" 
   } 
*/ 

?> 

The reason we have two empty strings here is that a boundary is discovered before any data has been collected from the string. The boundary splits the string into two parts even though those parts are empty. 

One way to avoid getting back empty parts (if you don't care for those empty parts) is to use array_filter on the result. 

<?php 

var_dump
(array_filter(explode("/","/"))); 

/* 
   Outputs 

   array(0) { 
   } 
*/ 
?> 

*[This note was edited by googleguy at php dot net for clarity]*
2012-07-14 06:36:04
http://php5.kiev.ua/manual/ru/function.explode.html
Here is my approach to have exploded output with multiple delimiter. 

<?php

//$delimiters has to be array
//$string has to be array

function multiexplode ($delimiters,$string) {
   
   
$ready str_replace($delimiters$delimiters[0], $string);
   
$launch explode($delimiters[0], $ready);
    return 
$launch;
}

$text "here is a sample: this text, and this will be exploded. this also | this one too :)";
$exploded multiexplode(array(",",".","|",":"),$text);

print_r($exploded);

//And output will be like this:
// Array
// (
//    [0] => here is a sample
//    [1] =>  this text
//    [2] =>  and this will be exploded
//    [3] =>  this also 
//    [4] =>  this one too 
//    [5] => )
// )

?>
2013-02-05 00:43:32
http://php5.kiev.ua/manual/ru/function.explode.html
Автор:
I needed a multiexplode which didn't replace my delimiters for 1 other delimiter. Because I couldn't find one in the examples I made one.

delimiter array:
array('/RTRN/','/BUSP/','/BENM/','/ORDP/','/CSID/', '/MARF/','/EREF/', '/PREF/','/REMI/','/ID/','/PURP/', '/ULTB/','/ULTD/');

input string: /RTRN/MS03//BENM/NL50INGB00012345/BUSP/Europese Incasso/eenmalig/67/INGBNL2A/ING Bank N.V. inzake WeB///CSID/NL32ZZZ999999991234//MARF/EV45451//EREF/EV45451 REP170112T1106//REMI///EV45451REP170112T1106/

output:
array(
[/RTRN/] => MS03/
[/BENM/] => NL50INGB00012345
[/BUSP/] => Europese Incasso/eenmalig/67/INGBNL2A/ING Bank N.V. inzake WeB//
[/CSID/] => NL32ZZZ999999991234/
[/MARF/] => EV45451/
[/EREF/] => EV45451REP170112T1106/
[/REMI/] => //EV45451REP170112T1106/
[/ORDP/] => 
[/PREF/] => 
[/ID/] => 
[/PURP/] => 
[/ULTB/] => 
[/ULTD/] =>
)

<?php
function multiexplode($delimiters,$string) {
           
       
$arrOccurence = array();
       
$arrEnd = array();
        foreach(
$delimiters as $key => $value){
           
$position strpos($string$value);
            if(
$position > -1){
               
$arrOccurence[$value] = $position;
            }
        }
       
        if(
count($arrOccurence) > 0){
               
           
asort($arrOccurence);
           
$arrEnd array_values($arrOccurence);
           
array_shift($arrEnd);
   
           
$i 0;
            foreach(
$arrOccurence as $key => $start){
               
$pointer $start+strlen($key);
                if(
$i == count($arrEnd)){
                   
$arrOccurence[$key] = substr($string$pointer);
                } else {
                   
$arrOccurence[$key] = substr($string$pointer$arrEnd[$i]-$pointer);
                } 
               
$i++;
            }
           
        }

         
//next part can be left apart if not necessary. In that case key that don't appear in the inputstringwill not be returned
       
foreach($delimiters as $key => $value){
            if(!isset(
$arrOccurence[$value])){
               
$arrOccurence[$value] = '';
            }
        }

        return 
$arrOccurence;
}
?>
2013-02-18 14:59:23
http://php5.kiev.ua/manual/ru/function.explode.html
Автор:
The comments to use array_filter() without a callback to remove empty strings from explode's results miss the fact that array_filter will remove all elements that, to quote the manual,  "are equal to FALSE".

This includes, in particular, the string "0", which is NOT an empty string.

If you really want to filter out empty strings, use the defining feature of the empty string that it is the only string that has a length of 0. So:
<?php
array_filter
(explode(':'"1:2::3:0:4"), 'strlen');
?>
2013-03-12 23:13:48
http://php5.kiev.ua/manual/ru/function.explode.html
Note that while the documentation states the "If limit is set and positive," passing a null-value will still result in triggering the "limit is zero" case (as of PHP 5.4.17).

When passing through values (such as using explode to implement an interface method), you'll need to explicitly check that the limit has been set:

<?php
 
public function split($string$delimiter$limit null)
  {
    return isset(
$limit) ? explode($delimiter$string$limit) : explode($delimiter$string);
  }
?>

Failing to check $limit and simply passing through a null-value will return the same value as if $limit were 0 or 1. To clarify, all of the following will return the same value:

<?php
explode
($string$delimiternull);
explode($string$delimiter0);
explode($string$delimiter1);
?>
2013-08-01 22:52:55
http://php5.kiev.ua/manual/ru/function.explode.html
Note that using explode() on an empty string returns a non-empty array.

So the code:
<?php
  print_r
(explode("|","");
?>
returns:
Array
(
    [0] => 
)

If you need to return an empty array in the case of an empty string, you must call array_diff() after the explode:
<?php
  print_r
(array_diff(explode("|",""),array("")));
?>
returns:
Array
(
)

This is useful in case your use of MySQL's group_concat() returns an empty string for just some records but you want to convert them all to arrays that actually reflect what group_concat() gave you
2014-01-31 18:29:58
http://php5.kiev.ua/manual/ru/function.explode.html
I made this code for some useful filtering texts with lot of gibberish. Example provided:

<?php
$text 
"There are;many|variations of:passages of Lorem Ipsum available,but the/majority have\"suffered|alteration in some form,by injected humour,or randomised words which don't look even.slightly:believable./";

$delimiter = array(" ",",",".","'","\"","|","\\","/",";",":");
$replace str_replace($delimiter$delimiter[0], $text);
$explode explode($delimiter[0], $replace);

echo 
'<pre>';
print_r($explode);
echo 
'</pre>';
// replaces many symbols in text, then explodes it
?>

This will output the following:
Array
(
    [0] => There
    [1] => are
    [2] => many
    [3] => variations
    [4] => of
    [5] => passages
    [6] => of
    [7] => Lorem
    [8] => Ipsum
    [9] => available
    [10] => but
    [11] => the
    [12] => majority
    [13] => have
    [14] => suffered
    [15] => alteration
    [16] => in
    [17] => some
    [18] => form
    [19] => by
    [20] => injected
    [21] => humour
    [22] => or
    [23] => randomised
    [24] => words
    [25] => which
    [26] => don
    [27] => t
    [28] => look
    [29] => even
    [30] => slightly
    [31] => believable
    [32] => 
    [33] => 
)
2014-02-25 12:58:17
http://php5.kiev.ua/manual/ru/function.explode.html
Автор:
It should be said that when an empty delimiter is passed to explode, the function not only will return false but will also emit a warning.

<?php
var_dump
explode('','asdasd') );

/**
  * Output:
  * Warning: explode(): Empty delimiter in ...
  * bool(false)
  */
?>
2014-11-23 04:17:37
http://php5.kiev.ua/manual/ru/function.explode.html
If you need to split by multiple characters, use preg_split() instead:

    $new_string = preg_split("/[&=:]/", $string);
2015-10-21 00:48:06
http://php5.kiev.ua/manual/ru/function.explode.html
(excuse my english)
When I try to use explode to know if a string contains many words, I noticed this :

<?php
      $sentence
"  word ";
     
$array explode($sentence); 
       
var_dump($array);
?>
return this :

array(4) {
  [0]=>  string(0) ""
  [1]=>  string(0) ""
  [2]=>  string(4) "word"
  [3]=>  string(0) ""
}

So, "explode" didn't keep the delimiter but counts it. You have to use trim($sentence) to count words in a sentence.  ^v^
2016-04-19 22:44:42
http://php5.kiev.ua/manual/ru/function.explode.html
Автор:
Sometimes I want to create a MINIMUM length array. For example, if the delimiter is not present at all, you might still want an empty additional item.

This can be done by adding the delimiter to the string as follows:

<?php
    $data
='a';
   
$array=explode(':',"$data:");
   
print_r($array);
?>

If you want an EXACT number of elements, you can combine this with array_slice:

<?php
    $data
='a:::';
   
$array=explode(':',"$data:");
   
$array=array_slice($array,0,2);    //    exactly 2 elements
   
print_r($array);
?>
2016-12-30 09:25:44
http://php5.kiev.ua/manual/ru/function.explode.html
As you can not send an enclosure value to explode, use str_getcsv,
if you want to explode a string when the delimiter is in some cells. (Comma in quotes)

<?php
  $a 
"aaa1,bbb1,'ccc,ccc1',ddd1";
 
$b 'aaa2,bbb2,"ccc,ccc2",ddd2';

 
// This dosn't work as it splits 'ccc,ccc1' and "ccc,ccc2".

 
print "<PRE>a output using explode():\n";
 
print_rexplode(",",$a) );
  print 
"</PRE>\n";

  print 
"<PRE>b output using explode():\n";
 
print_rexplode(",",$b) );
  print 
"</PRE>\n";

 
// This works.

 
print "<PRE>a output using str_getcsv():\n";
 
print_rstr_getcsv($a,",","'") );
  print 
"</PRE>\n";

  print 
"<PRE>b output using str_getcsv():\n";
 
print_rstr_getcsv($b,",","\"") );
  print 
"</PRE>\n";

?>
explode() returns;
    [0] => aaa1
    [1] => bbb1
    [2] => 'ccc
    [3] => ccc1'
    [4] => ddd1

str_getcsv() returns;
    [0] => aaa1
    [1] => bbb1
    [2] => ccc,ccc1
    [3] => ddd1
2017-05-14 13:42:51
http://php5.kiev.ua/manual/ru/function.explode.html

    Поддержать сайт на родительском проекте КГБ