Comment trier des données depuis un array en PHP ?

Réponses rédigées par Antoine
Dernière mise à jour : 2022-04-23 11:58:25
Thèmes : php - array - filtre
Question

Bonjour,

Je dois récupérer des données depuis une chaine de balises. J'ai ce code qui construit mon tableau.

    <?php
 
$string = "[ADC_START][HD][PMAD][USER_CMDB_DIF_NON][SFW_  < ASSET_XXX > < TPX _1 > ][RDV_NON][NO COMMENT][21/04/22-10:49][CHEKSOUN][Version_2.02][ADC_END]";
 
// Définition du tableau final
$clean_array = [];
 
// On split la chaine selon les crochets ouvrants
$string_to_array = preg_split('#\[#i', $string);
 
foreach ($string_to_array AS $v) {
    // On nettoie le string pour retirer le crochet fermant
    $str = trim(str_replace(']', '', $v));
    // Si la chaine n'est pas vide, on l'ajoute à notre tableau final
    if (!empty($str)) {
        $clean_array[] = $str;
    }
}
 
echo PHP_EOL . '<pre>$clean_array: ' . print_r($clean_array, true) . '</pre>' . PHP_EOL;

Maintenant j'aimerai savoir comment faire le tri pour réécrire la chaine?

$clean_array: Array
(
    [0] => ADC_START
    [1] => HD
    [2] => PMAD
    [3] => USER_CMDB_DIF_NON
    [4] => SFW_  < ASSET_XXX > < TPX _1 >
    [5] => RDV_NON
    [6] => NO COMMENT
    [7] => 21/04/22-10:49
    [8] => CHEKSOUN
    [9] => Version_2.02
    [10] => ADC_END
)

pour avoir comme résultat

[ADC_START][SDP][GUICHET][DEM][USER_CMDB_DIF_NON][RDV_NON][RDV_NON][RSDP_NON][SFW_  < ASSET_XXX > < TPX _1 > ][NO COMMENT][21/04/22-10:49][CHEKSOUN][Version_2.02][ADC_END]

Je sais que je dois renseigner les crochets manuellement.

$_SESSION['Balises2'] = '['. [0]. ']'. '['.  [1]. ']'. '['.[2]. ']'. '['.[3]. ']'. '['. [5]. ']'. '['. [5] . ']'. '['.[4]  . ']'. '['.[6]. ']'. '['.  [7]. ']'. '['.  [8]  . ']'. '['.[9]. ']'. '['. [10] . ']';

Deux fois le [5] c'est normal. Car je dois faire un IF pour savoir si [RDV_NON] est présent. faire le tri en doublant la balise[RDV_NON] Sinon faire le tri directement. Sachant que la chaine peut comporter plus de 20 balises par moment.

Merci beaucoup

Réponse

Bonjour, pour vérifier qu'un array contient un index ou une value en particulier, vous pouvez utiliser la fonction in_array.

if ((in_array('RDV_NON', $clean_array))
{
// ...
}

Ensuite vous assignez la value à une variable PHP, puis enfin vous concaténez les variables pour créer la chaine désirée. Ainsi plus besoin de filtrer et réorganiser l'array en temps que tel.

Une autre méthode serait de réorganiser l'array initial.

Pour réorganiser un array, vous pourriez utiliser la fonction array_slice pour extraire des portions de l'array, puis ensuite array_combine pour reformer un array réordonné. Vous pouvez également utiliser leur numéro d'index pour, au sein d'un nouvel array, réordonner les éléments ; méthode valable s'ils sont toujours dans le même ordre dans la chaine initiale.

Une fois votre nouvel array prêt, et pour passer d'un array à une chaine, vous pouvez utiliser la fonction implode.

$nouvelle_chaine = implode(",", $nouvel_array);

Puis ensuite remplacer les , par ][ avec str_replace comme vous l'avez précédemment fait, et enfin ajouter une crochet ouvert en début de chaine, et fermé en fin de chaine, via une concaténation.