J'ai un problème, j'ai un tableau de chaînes et je veux exploser dans un délimiteur différent. Par exemple
$example = 'Appel @ Ratte';
$example2 = 'Apple vs ratte'
et j'ai besoin d'un tableau qui est exploser dans @ ou contre.
J'ai déjà écrit une solution, mais si tout le monde a une meilleure solution, postez ici.
private function multiExplode($delimiters,$string) {
$ary = explode($delimiters[0],$string);
array_shift($delimiters);
if($delimiters != NULL) {
if(count($ary) <2)
$ary = $this->multiExplode($delimiters, $string);
}
return $ary;
}
qu'en est-il d'utiliser
$ output = preg_split ("/ (@ | vs) /", $ input);
Vous pouvez prendre la première chaîne, remplacer tous les @
avec vs
en utilisant str_replace
, puis exploser sur vs
ou inversement.
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] => )
// )
Source: php @ metehanarslan at php.net
Pourquoi ne pas utiliser strtr()
pour substituer le premier à tous vos autres délimiteurs?
private function multiExplode($delimiters,$string) {
return explode($delimiters[0],strtr($string,array_combine(array_slice($delimiters,1),array_fill(0,count($delimiters)-1,array_shift($delimiters))))));
}
C'est en quelque sorte illisible, je suppose, mais je l'ai testé comme pouvant fonctionner ici.
Un-liners ftw!
strtok()
ne fonctionnerait-il pas pour vous?
Vous pouvez simplement utiliser le code suivant:
$arr=explode('sep1',str_replace(array('sep2','sep3','sep4'),'sep1',$mystring));
Vous pouvez essayer cette solution .... Cela fonctionne très bien
function explodeX( $delimiters, $string )
{
return explode( chr( 1 ), str_replace( $delimiters, chr( 1 ), $string ) );
}
$list = 'Thing 1&Thing 2,Thing 3|Thing 4';
$exploded = explodeX( array('&', ',', '|' ), $list );
echo '<pre>';
print_r($exploded);
echo '</pre>';
Source: http://www.phpdevtips.com/2011/07/exploding-a-string-using-multiple-delimiters-using-php/
Je le fais de cette façon ...
public static function multiExplode($delims, $string, $special = '|||') {
if (is_array($delims) == false) {
$delims = array($delims);
}
if (empty($delims) == false) {
foreach ($delims as $d) {
$string = str_replace($d, $special, $string);
}
}
return explode($special, $string);
}
Que dis-tu de ça?
/**
* Like explode with multiple delimiters.
* Default delimiters are: \ | / and ,
*
* @param string $string String that thould be converted to an array.
* @param mixed $delimiters Every single char will be interpreted as an delimiter. If a delimiter with multiple chars is needed, use an Array.
* @return array. If $string is empty OR not a string, return false
*/
public static function multiExplode($string, $delimiters = '\\|/,')
{
$delimiterArray = is_array($delimiters)?$delimiters:str_split($delimiters);
$newRegex = implode('|', array_map (function($delimiter) {return preg_quote($delimiter, '/');}, $delimiterArray));
return is_string($string) && !empty($string) ? array_map('trim', preg_split('/('.$newRegex.')/', $string, -1, PREG_SPLIT_NO_EMPTY)) : false;
}
Dans votre cas, vous devriez utiliser un tableau pour le paramètre $ delimiters. Ensuite, il est possible d'utiliser plusieurs caractères en tant que délimiteur.
Si vous ne vous souciez pas de la fin des espaces dans vos résultats, vous pouvez supprimer la partie array_map('trim', [...] )
dans la ligne de retour. (Mais ne soyez pas un fainéant dans ce cas. Conservez le preg_split
Dedans.)
Obligatoire PHP Version: 5.3.0 ou supérieure.
Vous pouvez le tester ici
Vous allez avoir des problèmes (par exemple si vous avez cette chaîne: "vs @ apples" par exemple) en utilisant cette méthode de séparation, mais si nous commençons par dire que vous avez pensé à cela et que vous avez corrigé toutes les collisions possibles, vous pouvez simplement remplacer toutes les occurrences de $delimiter[1]
à $delimiter[n]
avec $delimiter[0]
, puis divisé sur ce premier?
Si votre délimiteur est composé uniquement de caractères, vous pouvez utiliser strtok
, ce qui semble être plus approprié ici. Notez que vous devez l’utiliser avec une boucle while
pour obtenir les effets.
Cela fonctionnera:
$stringToSplit = 'This is my String!' ."\n\r". 'Second Line';
$split = explode (
' ', implode (
' ', explode (
"\n\r", $stringToSplit
)
)
);
Comme vous pouvez le constater, il colle d’abord les\n\r parties éclatées avec un espace, puis le coupe à nouveau, en prenant cette fois les espaces avec lui.