[PHP] Double explode ? - string "EN FR;FR TK;RA TZ" à spliter

Salut à tous !

Aller on commence la semaine en force, avec une petite question :slight_smile:

J’ai une chaine de caractères qui devra prendre la forme suivante :

B1 EN;C4 RA

et ainsi de suite.

En gros il s’agit de codes qui vont par paire, et on peut en avoir plein… tout est malheureusement stocké comme du texte dans une seule colonne dans la BDD.

D’où mon besoin, dans un premier temps, de nettoyer tout ca :slight_smile:

$string = "B1 EN;C4 RA";

$aff = explode(";", $string);

foreach($aff as $value)
{
    echo $value.'<br>";
}

// Affiche :
// B1 EN
// C4 RA
?>

Jusqu’ici tout est ok à mon avis.

Sauf que, ces codes ont bien évidement une signification, comme indiqué : ils vont en couple. en gros le premier indique une position, et le second désigne une nature de dégats (enfoncé = EN par exemple). Il me faudrait donc traduire ces éléments en bon français.

Je pense construire un array de type : $arr = array("foo" => "bar", … mais avec mes codes.

Ainsi je dois pouvoir afficher en clair chacun de mes codes.

Mais comment respliter mes “sous codes” ? J’ai tenté un autre explode dans le premier, mais ca me semble un peu hasardeux comme méthode.

Merci par avance pour vos lumières, j’espère être à peut près clair, car c’est passablement confu pour moi :slight_smile:

Alors voyons ce que ca donne désormais :slight_smile:

<?php
$query = "SELECT $ from `localisation`";
$requeteID = mysql_query($query);
$localisations = array();

while ($data = mysql_fetch_array($requeteID))
{
 $localisations[$data[code_localisation]] = $data[nom_localisation];
}
echo $localisations[A1];
// Affiche correctement le nom localisation correspondant au code localisation A1;) supair !

Pour la suite mon explode a pas changé en revanche…

Comment exploser mon "A1 BE;A1 RE"; pour géré tout ca ?

Bon je sais pas pourquoi ca marchait pas, mais ca semble désormais fonctionner :slight_smile:

foreach ($aff as $value)
{
  $subaff = explode(";",$value)
  {
    echo $localisations[$value];
  }
}

N’est ce pas un peu lourd comme méthode en revanche ? Existe-il un truc plus rapide et plus simple pour faire ca ?

$string = "B1 EN; A2 BL";
$truc = array();
//La tu explodes ta chaine en petites sous chaînes
$explode_string = explode(';', $string);
//On fait toutes les sous chaines pour chopper les A1 séparés des EN
foreach($explode_string as $estring)
{
  $truc[] = explode(' ', $estring);
}

Voila…
Truc c’est un tableau qui contient un tableau pour chaque “A1 EN” avec en 0 A1 et en 1 EN

Si je print_r $truc, ca donne :

Array([0] => Array([0] => A1 [1]=> RE)[1]=> Array([0] => B20[1]=>BT))

Tordu non ?

Ben non c’est bon, tu voulais que ca fasse quoi ? :o

Bah maintenant je sais plus afficher mon texte du coup :stuck_out_tongue:


foreach($truc as $bloc)
{
  echo 'blablabla'.$tableauAvecLesLocalisations[$bloc[0]].' avaries : '.$tableauAvecLesAvaries[$bloc[1]];
}

Sinon plutot que de reboucler dessus, tu le mets à la place de truc[] = … dans le premier code que je t’ai donné.

Je dois pas être doué ^^

$string = "A1 RE;B20 BT";
$truc = array();

$explode_string = explode(";","$string);

foreach($explode_string as $estring)
{
  $truc[] = explode(" ", $estring);
}
foreach($truc as $bloc)
{
  echo $truc[$bloc[0]].' '. $truc[$bloc[1]];
}

ya pas bon là ?

Apprends a faire un foreach :o

déjà là y’a un parse error > explode(";","$string) :o

(suis en train de tester débugger le reste :paf:)

oué en effet, y’a des ptits pb de compréhension …

si tu veux te servir de ta première valeur comme d’index dans ton tableau, il va falloir ruser un peu, car explode et tout ça créer des valeurs (et non des clés) …

si tu fait un print_r(), de $truc, ça ressemble à ça :


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

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

)

alors que toi en gros, tu voudrais un truc genre


Array
(
    [A1] =>  RE
    [B20] =>  BT
)

là dans l’immédiat, j’ai que la soluce d’un tableau temporaire :neutre:


$string = "A1 RE;B20 BT";
$truc = array();

$explode_string = explode(";", $string);

foreach($explode_string as $estring)
{
	$arrTmp = explode(" ", $estring);
  $truc[$arrTmp[0]] = $arrTmp[1];
}

echo '<pre>',print_r($truc),'</pre>';

vu le format tu peux y aller directement avec strpos, non?

j’ai des trucs qui sont du genre A1 et d’autres A22, donc pas la même taille non ?

Sinon la typo notée plus haut est une erreur de frappe dans mon post, ca fonctionne naturellement.

Je sais pas si je vais pas rester avec mon double foreach quand même, ca sera peut être plus simple… Parce que stocker les deux morceaux de code c’est qu’un morceau, je stocke avant ca les codes en index d’array et les équivalents en texte complet de ces codifications…

A1 => TRUC MUCHE DE BLABLA

et ensuite

echo : $array[$truc[]] pour afficher le bon texte.

Le temps de trouver ma clef usb, je poste le code complet ici :slight_smile:

t’as regardé DTC ? :o

[:shy] :ane: [:abricot]

ah je viens de tester ton truc et il y a un soucis : si j’ai des clefs en double, il écrase les anciennes :slight_smile:

Et j’ai retrouvé ma clef USB d’abord :o

Faut juste que je reboot le PC car les deux ports du portable ont le "bug" (celui quand tu débranches à la bourrin :D)…

<html>
<head>
<title>test</title>
</head>
<body>
<?php

include('dbconn.php');

$query = "SELECT * FROM `localisation`";
$requeteID = mysql_query($query);
$localisations = array();
while($data = mysql_fetch_array($requeteID))
{
$localisations[$data[code_localisation]] = $data[nomLocalisation];
}
$query = "SELECT * FROM `natures`";
$requeteID = mysql_query($query);
while($data = mysql_fetch_array($requeteID))
{
	$localisations[$data[codeNature]] = $data[nomNature];
}

$string = "A1 RE;B20 MA;B20 RE;D10 BR;S5 MO";
$truc = array();

$explode_string = explode (";",$string);

foreach($explode_string as $value)
{
	echo '<p>';
	$i = 0;
	$subaff = explode(" ",$value);
	foreach($subaff as $value)
	{
  if (in_array($value,$subaff))
  {
  	$i += 1;
  	if ($i > 1)
  	{
    echo '<br>';
  	}
  	echo $localisations[$value];
  }
  else
  {
  	echo 'Code invalide';
  }
	}
	echo "</p>\n";
}

?>
</body>
</html>

oui donc strpos sur les espaces, et ‘;’.