|
explode
Split a string by string
(PHP 4, PHP 5)
Example 2407. explode() examples<?php Example 2408. limit parameter examples<?php The above example will output: Array Related Examples ( Source code ) » explode Examples ( Source code ) » File based login Examples ( Source code ) » Print all MySQL status value Examples ( Source code ) » Read text file into array and output Examples ( Source code ) » explode CSV file Examples ( Source code ) » Define your own exception class Examples ( Source code ) » explode time Examples ( Source code ) » Takes a string apart based on a delimiter Examples ( Source code ) » list and explode Examples ( Source code ) » Execute help command and check its output Examples ( Source code ) » Define and use your own exception class Examples ( Source code ) » Check DNS error Examples ( Source code ) » Create a PDF document containing a pie chart Examples ( Source code ) » Animated Talking Captcha php class Examples ( Source code ) » Create a swf slideshow Code Examples / Notes » explodetajhlande
While trying to use explode() to parse CSV formatted lines output by MS Excel, I found that if cells contained a comma, then explode() would not behave as desired. So I wrote the following function, which obeys the double quote escaping format output by Excel. Note that it is not sophisticated enough to handle delimiters or escapes that consist of more than one character. I also have no idea how this code will perform when subjected to Unicode data. Use at your own risk. <?php // splits a string into an array of tokens, delimited by delimiter char // tokens in input string containing the delimiter character or the literal escape character are surrounded by a pair of escape characteres // a literal escape character is produced by the escape character appearing twice in sequence // default delimiter character and escape character are suitable for Excel-exported CSV formatted lines function splitWithEscape ($str, $delimiterChar = ',', $escapeChar = '"') { $len = strlen($str); $tokens = array(); $i = 0; $inEscapeSeq = false; $currToken = ''; while ($i < $len) { $c = substr($str, $i, 1); if ($inEscapeSeq) { if ($c == $escapeChar) { // lookahead to see if next character is also an escape char if ($i == ($len - 1)) { // c is last char, so must be end of escape sequence $inEscapeSeq = false; } else if (substr($str, $i + 1, 1) == $escapeChar) { // append literal escape char $currToken .= $escapeChar; $i++; } else { // end of escape sequence $inEscapeSeq = false; } } else { $currToken .= $c; } } else { if ($c == $delimiterChar) { // end of token, flush it array_push($tokens, $currToken); $currToken = ''; } else if ($c == $escapeChar) { // begin escape sequence $inEscapeSeq = true; } else { $currToken .= $c; } } $i++; } // flush the last token array_push($tokens, $currToken); return $tokens; } ?> kevin
We've written a function: explodeTree() that can explode any single-dimensional array into a full blown tree. The function uses a user-specified delimiter found in the keys of the original array to separate nodes and determine hierarchy. Sample: with 3 lines of code you could have a full directory hierarchy in a multi-dimensional array if you specify the delimiter to be a '/' (slash). I'm posting a link because the function is being improved by site visitors commenting on the article: http://kevin.vanzonneveld.net/techblog/article/72/ tobylewis
Watch out for this gottcha. Consider: $arr = explode("/", ""); This should return a null array (ie count($arr) == 0). Array ( ) However, explode will instead return an array of one item which is a null string. Array ( [0] => ) There is some logic to the way this works but consider the following: $addressees = "email@domain1.com, email@domain2.com"; $arr = explode(",", $addressees); foreach($arr AS $to) mail ($to, $subject, $message); with two items in the list it would sent two separate emails, with one it would sent one email message but with $addressees = "" it will still attempt to send one message that will fail because instead of returning an empty array explode returns an array with an empty item. coroa
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"); thomas
This had me for a moment. A quick gotcha, for me, because it was causing some problems in a script of mine. If you explode an empty string, you'll get an array with one element - an empty string, and not an empty array or string as you may think. For example: <?php $string = ""; $numbers = explode(",", $string); // Array with one element, "". $string = "1,2,3"; $numbers = explode(",", $string); // Array with three elements ?> q1712
some more notes on the delimiter: if the delimiter is 0, explode will return an array with one element containig the hole string (same as if the delimiter was 1). if a negative delimiter is bigger or equal to the number of components, an empty array is returned. <?php print_r( explode( "|", "one|two|three|four", 0) ); print_r( explode( "|", "one|two|three|four", 1) ); ?> both print: Array ( [0] => one|two|tree|four ) <?php print_r( explode( "|", "one|two|three|four", -4) ); print_r( explode( "|", "one|two|three|four", -5) ); ?> both print: Array ( ) seventoes
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)); ?> jj rock
Just a quick note to compliment jason dot minett's comment a few down: It's obvious that this works the opposite way as well: <?php $str = "^one^two^three"; $arr = explode ("^", $str); ?> results in an empty value in $arr[0]. nicoxinchao
insensitive case explode function: <?php function iExplode($Delimiter, $String, $Limit = '') { $Explode = array(); $LastIni = 0; $Count = 1; if (is_numeric($Limit) == false) $Limit = ''; while ( false !== ( $Ini = stripos($String, $Delimiter, $LastIni) ) && ($Count < $Limit || $Limit == '')) { $Explode[] = substr($String, $LastIni, $Ini-$LastIni); $LastIni = $Ini+strlen($Delimiter); $Count++; } $Explode[] = substr($String, $LastIni); return $Explode; } ?> webmaster
If you want to split a price (float) into pounds and pence. or dollors and cents etc etc. $price = "6.20"; $split = explode(".", $price); $pound = $split[0]; // piece1 $pence = $split[1]; // piece2 echo "£ $pound . $pence\n"; ian
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. <?php $str = ''; $foo = explode( ":", $str ); print_r( $foo ); $foo = split( ":", $str ); print_r( $foo ); $foo = preg_split( "/:/", $str ); print_r( $foo ); ?> In all three cases prints Array ( [0] => ) This of course means that you must explicitly check to see if the value of the first element is blank, or must check to see if the string being split is blank. pinkgothic
coroa at cosmo-genics dot com mentioned using preg_split() instead of explode() when you have multiple delimiters in your text and don't want your result array cluttered with empty elements. While that certainly works, it means you need to know your way around regular expressions... and, as it turns out, it is slower than its alternative. Specifically, you can cut execution time roughly in half if you use array_filter(explode(...)) instead. Benchmarks (using 'too many spaces'): Looped 100000 times: preg_split: 1.61789011955 seconds filter-explode: 0.916578054428 seconds Looped 10000 times: preg_split: 0.162719011307 seconds filter-explode: 0.0918920040131 seconds (The relation is, evidently, pretty linear.) Note: Adding array_values() to the filter-explode combination, to avoid having those oft-feared 'holes' in your array, doesn't remove the benefit, either. (For scale - the '9' becomes a '11' in the benchmarks above.) Also note: I haven't tested anything other than the example with spaces - since djogo_curl at yahoo's note seems to imply that explode() might get slow with longer delimiters, I expect this would be the case here, too. I hope this helps someone. :) djogo_curl
Being a beginner in php but not so in Perl, I was used to split() instead of explode(). But as split() works with regexps it turned out to be much slower than explode(), when working with single characters.
jason dot minett
A quick gotcha that had me head scratching for a while.... If the delimiter occurs right at the end of the string there will be an extra array element (an empty string): <?php $str = "aaa^elephant^chocolate^albatross^"; $arr = explode ("^", $str); echo ("Array length: ".count($arr)); ?> --------------------------------- Array length: 5 orlandu96
A 'between' function that we've all been waiting for. I am not savvy with regex so I resorted to explode(); <?php function between($beg, $end, $str) { $a = explode($beg, $str, 2); $b = explode($end, $a[1]); return $beg . $b[0] . $end; } echo between('<a>', '</a>', 'fsdfsdfsd<a>fsdfsd<a><a></a>sdfsdfsdf') //<a>fsdfsd<a><a></a> ?> ianb
@ tobylewis No, it should not return a null array! The description clearly states: If delimiter contains a value that is not contained in string, then explode() will return an array containing string. So it returns an array containing the original (empty) string. Wouldn't you test for an invalid email address before trying to mail to it anyway? :S xangelusx
@ JJ Rock, jason dot minett: Here's an easy way around that: <?php $str = '^one^two^three^'; //Use trim() to remove extra delimiters $arr = explode ('^', trim($str, '^')); ?> elad elrom
// simple function to remove words if more than max allowed words or add a charcter once less than min // Example: LimitText("The red dog ran out of thefence",15,20," "); function LimitText($Text,$Min,$Max,$MinAddChar) { if (strlen($Text) < $Min) { $Limit = $Min-strlen($Text); $Text .= $MinAddChar; } elseif (strlen($Text) >= $Max) { $words = explode(" ", $Text); $check=1; while (strlen($Text) >= $Max) { $c=count($words)-$check; $Text=substr($Text,0,(strlen($words[$c])+1)*(-1)); $check++; } } return $Text; } user
<?php // returns a string where $variables are replaced with their global value if available; removes all extra whitespaces function evaluateString($string) { if ($string) { // check for value $array = explode(' ', $string); // split into parts foreach ($array as $word) { // each part if ($word[0] == '$') { // is part a variable if ($word = substr($word, 1)) { // get variable name global ${$word}; // retrieve global value $html .= ${$word}; // add value to string } // end variable name check } else { // not a variable $html .= $word; // add word to string } // end variable check $html .= ' '; // add space between words } // end part loop } // end string check return trim($html); // trims final space from end } // end evaluateString ?> mraheel83
<?php $query = "SELECT * FROM `orders_status` Where status = 'enabled'"; $result = mysql_query($query); $counter = 0; $orderStatusRecords = explode(",",$_REQUEST['orderStatus']); while($row = mysql_fetch_array($result)) { echo $orderStatusRecords[$counter]; ?> <input type="checkbox" name="chkOrderStatus[]" value="<?=$row['id']?>" <?php if($row['id'] == $orderStatusRecords[$counter]) {?> checked="checked" <?php } ?> /> <?=$row['title']?> <?php $counter++; } ?> You can checked selected checkbox by using above explode + while loop combination |
Change Languageaddcslashes addslashes bin2hex chop chr chunk_split convert_cyr_string convert_uudecode convert_uuencode count_chars crc32 crypt echo explode fprintf get_html_translation_table hebrev hebrevc html_entity_decode htmlentities htmlspecialchars_decode htmlspecialchars implode join levenshtein localeconv ltrim md5_file md5 metaphone money_format nl_langinfo nl2br number_format ord parse_str printf quoted_printable_decode quotemeta rtrim setlocale sha1_file sha1 similar_text soundex sprintf sscanf str_getcsv str_ireplace str_pad str_repeat str_replace str_rot13 str_shuffle str_split str_word_count strcasecmp strchr strcmp strcoll strcspn strip_tags stripcslashes stripos stripslashes stristr strlen strnatcasecmp strnatcmp strncasecmp strncmp strpbrk strpos strrchr strrev strripos strrpos strspn strstr strtok strtolower strtoupper strtr substr_compare substr_count substr_replace substr trim ucfirst ucwords vfprintf vprintf vsprintf wordwrap |