Fonction Implode

Résolu
sbach73 Messages postés 6 Date d'inscription mardi 18 juillet 2006 Statut Membre Dernière intervention 24 septembre 2008 - 17 sept. 2008 à 18:40
cs_TASIOT Messages postés 20 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 26 septembre 2008 - 24 sept. 2008 à 16:34
Bonjour,

J'ai actuellement un problème que ne n'arrive pas à résoudre.

J'aimerai pouvoir faire une fonction qui m' implode avec plusieurs séparateurs un tableau multidimensionnel.
Est ce possible ?
Si, oui est ce qu' une âme charitable peut me donner une fonction pour.

Merci.

sbach73

8 réponses

cs_TASIOT Messages postés 20 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 26 septembre 2008
24 sept. 2008 à 13:19
Voici la fonction que tu désires tant ! :)

function implodePerso(array $array, array $separateurs, $level = 0){
    $buffer = '';
    $i = 0;
    foreach ($array as $key => $val) {
        if ($i > 0 && array_key_exists($level, $separateurs)){
            $buffer .= $separateurs[$level];
        }
        if (is_array($val)){
            $buffer .= implodePerso($val, $separateurs, $level +1);
        } else {
            $buffer .= $val;
        }
        $i++;
    }
    return $buffer;
}

Exemple d'utilisations :

$tab = array(
    array(
        array('rp1', '200'),
        array('rp2', '300'),
        array('rp3', '190')
    ),
    array(
        array('rp1', '255'),
        array('rp2', '150'),
        array('rp3', '35')
    )
);

echo implodePerso($tab, array("\n", '|', '-'));

Explications :
Le second tableau transmis à ta fonction contient les séparateurs que tu désires appliquer par dimension de ton tableau. Ainsi "\n" sera appliqué 2 fois, "|" 3 fois et "-" 2 fois.

Si tu as des questions n'hésite pas !

PS: Le dernier argument de la fonction ($level) est utilisé en récursivité par la fonction elle-même. Il t'est inutile de le transmettre lors de l'appel de la fonction.

Roland Dufour,
http://www.multiprog.net
http://portfolio.multiprog.net
3
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
17 sept. 2008 à 21:54
salut

je ne comprends pas ce que tu entends par plusieurs separateurs...
0
sbach73 Messages postés 6 Date d'inscription mardi 18 juillet 2006 Statut Membre Dernière intervention 24 septembre 2008
18 sept. 2008 à 12:32
Désolé je me suis mal exprimé.

Le mieux, c'est l'exemple :

J'ai un tableau multidimensionnel :

array(5) {
[0]=>array(4) {
[0]=>array(2) {
[0]=>string(3) "rp1"
[1]=>string(3) "200"
}
[1]=>array(2) {
[0]=>string(3) "rp2"
[1]=>string(3) "300"
}
[2]=>array(2) {
[0]=>string(3) "rp3"
[1]=>string(3) "190"
}
}

[1]=>array(4) {
[0]=>array(2) {
[0]=>string(3) "rp1"
[1]=>string(3) "255"
}
[1]=>array(2) {
[0]=>string(3) "rp2"
[1]=>string(3) "150"
}
[2]=>array(2) {
[0]=>string(3) "rp3"
[1]=>string(3) "35"
}
}
}

Je voudrais donc faire une fonction qui utilise la fonction implode pour rassembler le tableau selon le schéma que je vais lui donner.

Exemple de résultat :

rp1-200|rp2-200|rp3-190\n
rp1-255|rp2-150|rp3-35

Le schéma est donc :

array("-", "|","\n") 

( regroupement avec - puis avec | puis avec \n )

Voila j'espère que cet exemple sera plus parlant.

sbach73
0
cs_mike1310 Messages postés 232 Date d'inscription jeudi 30 août 2007 Statut Membre Dernière intervention 31 juillet 2009
19 sept. 2008 à 11:47
ça m'a l'air bien compliqué tous ces tableaux de tableaux ... tu n'as pas essayé de réduire tes tableaux ? Je veux dire par la qu'il y a forcemment moyen de les rassembler en amont.

Comment les obtiens tu ces tableaux ?

Sinon il faudrait imbriqué autant de foreach que tu as de tableaux contenant tes données (donc un truc assez lourd niveau code)..
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_mike1310 Messages postés 232 Date d'inscription jeudi 30 août 2007 Statut Membre Dernière intervention 31 juillet 2009
19 sept. 2008 à 14:26
tiens j'ai trouver un truc intéressant :

function array_implode($arrays, &$target = array()) {

    foreach ($arrays as $item) {

        if (is_array($item)) {

            array_implode($item, $target);

        } else {

            $target[] = $item;

        }

    }

    return $target;

}

$a = array('a', 'b', array('c', 'd', array('e'), 'f'), 'g', array('h'));

echo join(' - ', array_implode($a));


ça renvoi ceci :

a - b - c - d - e - f - g - h
0
sbach73 Messages postés 6 Date d'inscription mardi 18 juillet 2006 Statut Membre Dernière intervention 24 septembre 2008
19 sept. 2008 à 18:01
Ma fonction explode me permet de spécifier un schéma d'explosion sur du texte a exploser :

<?php

function explode_recursive($delimiters, $string) {

    if (!is_array($delimiters)) {
        $delimiters = array($delimiters);
    }
  
    $delimiter = array_shift($delimiters);
  
    if (!empty($delimiters))
    {  
        $arExploded = explode($delimiter, $string);
      
        if ($arExploded !== false) {      
            foreach ($arExploded as $key => $value) {
                $arExploded[$key] = explode_recursive($delimiters, $value);
            }
        }
      
        return $arExploded;
    }
    else
    {
        return explode($delimiter, $string);
    }
}

/* Exemple : */
$Text = 'rp1:200-rp2:300-rp3:190-ep:4||1.5|60|\n
                  \n
                  \n
                  4-5-10-14|';
$Delimiteurs = array('\n','|','-',':');

var_dump(explode_recursive($Delimiteurs, $Text));

?>

En fait il faut que je fasse l'inverse de cette fonction.

sbach73
0
sbach73 Messages postés 6 Date d'inscription mardi 18 juillet 2006 Statut Membre Dernière intervention 24 septembre 2008
24 sept. 2008 à 15:18
Merci infiniment de ce script cela va me faire gagner du temps.

sbach73
0
cs_TASIOT Messages postés 20 Date d'inscription jeudi 18 septembre 2003 Statut Membre Dernière intervention 26 septembre 2008
24 sept. 2008 à 16:34
Mais de rien, ce fut un plaisir de me casser la tête sur ton script durant une dizaines de minutes :). Tu noteras que si le séparateur du niveau de ton tableau n'existe pas (exemple : tu rajoutes une dimension à ton tableau sans modifier le tableau des séparateurs, aucun séparateur ne sera appliqué pour ce niveau.
Tu pourrais palier à ce problème en définissant un séparateur par défaut dans ta fonction genre :
if ($i > 0 && array_key_exists($level, $separateurs)){
     $buffer .= $separateurs[$level];
} elseif ($i > 0){
     $buffer .= ':'; // <= ton séparateur par défaut
}

De même, si tu ne veux pas appliquer de séparateur sur les premiers niveaux, envoie simplement une chaine vide en tant que séparateur :
echo implodePerso($tab, array('', '|', '-')); // Aucun séparateur sur le 1er niveau

Roland Dufour,
http://www.multiprog.net
http://portfolio.multiprog.net
0
Rejoignez-nous