8791 sujets

Développement web côté serveur, CMS

Bonjour à vous,
et merci d'avance de l'aide que vous allez pouvoir m'apporter.

J'essai donc de trier un array en réorganisant les données, le probleme est que ca marche pour la plupart des données mais pour certaines soit elles sont balancés aux oubliettes soit elles viennent se mettre dans une categorie qui n'est pas la leurs.

L'array avant tri ressemble à ça:

<?php
$aNormalForums = Array (
      0 => Array ('forum_id' => 3, 'cat_id' => 1, 'forum_nom' => 'Titre1'),
      1 => Array ('forum_id' => 4, 'cat_id' => 1, 'forum_nom' => 'Titre2'),
      2 => Array ('forum_id' => 5, 'cat_id' => 2, 'forum_nom' => 'Titre3'),
      3 => Array ('forum_id' => 11, 'cat_id' => 4, 'forum_nom' => 'Titre4'),
      4 => Array ('forum_id' => 12, 'cat_id' => 4, 'forum_nom' => 'Titre5'),
      5 => Array ('forum_id' => 120, 'cat_id' => 4, 'forum_nom' => 'Titre6'),
      6 => Array ('forum_id' => 13, 'cat_id' => 4, 'forum_nom' => 'Titre7'),
      7 => Array ('forum_id' => 14, 'cat_id' => 4, 'forum_nom' => 'Titre8'),
      8 => Array ('forum_id' => 16, 'cat_id' => 5, 'forum_nom' => 'Titre9'),
      9 => Array ('forum_id' => 17, 'cat_id' => 2, 'forum_nom' => 'Titre10'),
      10 => Array ('forum_id' => 19, 'cat_id' => 2, 'forum_nom' => 'Titre11'),
)
?>


ensuite, je le tri avec ça (le problème doit donc être quelque part par la) :

<?php
$aCountId       = 0; // clé categorie courante
$aCountForum    = 0; // clé forum courant
$currentId      = ''; // id de la categorie courante
$aSaveCount     = Array(); // Format :: id_cat => Array(clé_cat, clé_forum+1)
$aOrderedForums = Array(); // Array qui contiendra les données correctement triées

foreach($aNormalForums as $aForum)
{
    // Si la categorie n'est plus la meme
    if($currentId != $aForum['cat_id'])
    {
        // Si c'est la premiere iteration ..
        if(empty($currentId))
        {
            // on met à 0 le compteur de categorie, pareil pour le compteur forum
            $aSaveCount[$aForum['cat_id']] = Array(0, 0);
        }
        else
        {
            // Si la categorie a pas déja été sauvegardé dans $aSaveCount
            if(array_key_exists($aForum['cat_id'], $aSaveCount))
            {
                // On va chercher dans $aSaveCount la clé de la categorie ainsi que la clé forum 
                // - et on les mets comme valeurs courantes
                $aCountForum = $aSaveCount[$aForum['cat_id']][1];
                $aCountId = $aSaveCount[$aForum['cat_id']][0];
            }
            else
            {
                // On reinitialise la clé forum || on incrémente la clé categorie || on 
                // - sauvegarde la nouvelle categorie dans $aSaveCount
                $aCountForum = 0;
                $aCountId++;
                $aSaveCount[$aForum['cat_id']] = Array($aCountId, 0);
            }
        }
        $aOrderedForums[$aCountId]['cat_id'] = $aForum['cat_id'];
        $currentId = $aForum['cat_id'];
    }
    
    $aOrderedForums[$aCountId]['Forums'][$aCountForum] = Array('id' => $aForum['forum_id'], 'cat_id' => $aForum['cat_id'], 'name' => $aForum['forum_nom']);
    $aCountForum++;
    $aSaveCount[$aForum['cat_id']][1]++;
}
?>


et en resultat je me retrouve avec des trucs du genres :

2 => Array
    (
        cat_id => 4           ------> L'id de la categorie est 4 
        Forums => Array
            (
                0 => Array
                    (
                        id => 60
---------> Des categories 3 viennent loger dans la mauvaise categorie :                        
                        cat_id => 3
                        name => Titre16
                    )

                1 => Array
                    (
                        id => 41
                        cat_id => 3
                        name => Titre21
                    )

                2 => Array
                    (
                        id => 15
---------> Mais il y a quand meme des 4 ce qui fait un beau melange :                        
                        cat_id => 4
                        name => Titre30
                    )

                3 => Array
                    (
                        id => 119
                        cat_id => 4
                        name => Titre31
                    )

            )

    )


donc voila je vous serez super reconnaissant si vous trouver ce qui cloche.
Moi j'ai fais le tour 5H pas moyen Smiley decu

Yuki Smiley cligne
Modifié par Yuk! (15 Sep 2008 - 16:32)
Hello,

As-tu trouvé la solution aujourd'hui ? En général après 5h sur le même problème on ne fait rien de bon, et on trouve la solution toute seule le lendemain matin au saut du lit Smiley cligne

Si tu es toujours bloqué, peux-tu nous indiquer le résultat que tu espere obtenir ? Tu indiques que tu veux "réorganiser les données", mais tu n'expliques pas de quelle manière.

Une petite explication en quelques mots sera plus compréhensible que d'essayer de comprendre ton code Smiley cligne
Salut Yuk et bienvenue Smiley smile ,

Tymlis a écrit :

Une petite explication en quelques mots sera plus compréhensible que d'essayer de comprendre ton code Smiley cligne
+1


2 petites remarques :
* tout dépend de ce que tu veux faire mais si ça n'est pas pour un simple listing (ça ressemble bien à l'affichage par catégorie d'une première page de forum) tu pourrais organiser plus simplement tes données.
* quoi qu'il en soit je suppose que ces données sont récupérées depuis une BDD et si c'est bien le cas la clause ORDER BY d'une requête est faite pour ça.

Un petit exemple :
<?php
$sql = 'Select forum_id, cat_id, forum_nom From forums Order By cat_id, forum_nom';
$result = mysql_query($sql) or die(mysql_error());
if (mysql_num_rows($result) > 0) {
	$cat_en_cours = 0;
	while ($row = mysql_fetch_assoc($result)) {
		if ($row['cat_id'] != $cat_en_cours) {
			echo '<h2>Catégorie '.$row['cat_id']."</h2>\n";
			$cat_en_cours = $row['cat_id'];
		}
		echo '<p><a href="listforum.php?forum_id='.$row['forum_id'].'">'.$row['forum_nom']."</a></p>\n";
	}
}
?>

A+
Je sors des données sérialisés de la bdd, je les deserialise, elles sont sous forme d'array. Voila d'ou vient l'array de "base".

Ensuite, je souhaite réorganiser cet array en regroupant les forums par categories chose qui n'est pas faite dans l'array de base, et qui ne peut etre faite par la clause ORDER BY vu que ce ne sont pas plusieurs champs mais bel et bien un seul champs avec données sérialisé.

Le problème est que le lors de la réorganisation des categories se melangent.
C-a-d que certains forums viennent se mettrent dans de mauvaises categories (ici les forums de la categories 3 se mettent dans la categorie 4) alors que les autres sont bien classé. Je ne comprend donc pas pourquoi certain sont bien reorganiser et d'autres non.
Modifié par Yuk! (14 Sep 2008 - 11:15)
Yuk! a écrit :

Je sors des données sérialisés de la bdd, je les deserialise, elles sont sous forme d'array. Voila d'ou vient l'array de "base".
Ah... Dommage ! Tu es obligé(e) de faire comme ça ? Smiley murf

Si oui tu pourrais utiliser array_multisort et faire :
<?php
$aNormalForums = Array (
      0 => Array ('forum_id' => 3, 'cat_id' => 1, 'forum_nom' => 'Titre1'),
      1 => Array ('forum_id' => 4, 'cat_id' => 1, 'forum_nom' => 'Titre2'),
      2 => Array ('forum_id' => 5, 'cat_id' => 2, 'forum_nom' => 'Titre3'),
      3 => Array ('forum_id' => 11, 'cat_id' => 4, 'forum_nom' => 'Titre4'),
      4 => Array ('forum_id' => 12, 'cat_id' => 4, 'forum_nom' => 'Titre5'),
      5 => Array ('forum_id' => 120, 'cat_id' => 4, 'forum_nom' => 'Titre6'),
      6 => Array ('forum_id' => 13, 'cat_id' => 4, 'forum_nom' => 'Titre7'),
      7 => Array ('forum_id' => 14, 'cat_id' => 4, 'forum_nom' => 'Titre8'),
      8 => Array ('forum_id' => 16, 'cat_id' => 5, 'forum_nom' => 'Titre9'),
      9 => Array ('forum_id' => 17, 'cat_id' => 2, 'forum_nom' => 'Titre10'),
      10 => Array ('forum_id' => 19, 'cat_id' => 2, 'forum_nom' => 'Titre11'),
);

foreach ($aNormalForums as $key => $row) {
    $cat_id[$key]  = $row['cat_id'];
    $forum_nom[$key] = $row['forum_nom'];
}

array_multisort($cat_id, SORT_ASC, $forum_nom, SORT_ASC, $aNormalForums);
?>
<pre>
<?php print_r($aNormalForums); ?>
</pre>

A+
Modifié par Heyoan (14 Sep 2008 - 13:40)
Merci de t'être penché sur le sujet Heyoan,
J'ai enfin de compte opter pour une autre solution.
Merci quand meme Smiley cligne