8791 sujets

Développement web côté serveur, CMS

Deuxième problème:
____________________________________________________________________________
Encore un besoin d'aide ^^'
La fonction PHP array-multisort() trie bien le tableau multi dimension
mais il trie dimension par dimension.

Serait-il possible de trier un tableau multidimensionnel toutes ses dimensions comprises et non suivant l'une ou l'autre ?

Mon code est opérationnel. il donne un aperçu, pour mieux comprendre... :

<?php
	$id=1; $pages=5;
	for($id=1; $id<$pages; $id++){
		//Récupère les valeurs des pages.
		$page = file_get_contents("http://www.shinobi.fr/index.php?page=classement&village=gensou&p=$id");
		$found1 = (int) preg_match_all('#<td class="nom">(.*)</td>#isU', $page, $pseudo[$id], PREG_PATTERN_ORDER);
		$found2 = (int) preg_match_all('#<td class="droite evolution">(.*)</td>#isU', $page, $evo[$id], PREG_PATTERN_ORDER);
		$classement[$id] = array_combine($pseudo[$id][0], $evo[$id][1]);
		arsort($classement[$id]);
		foreach($classement[$id] as $key => $value){
			echo 'Pseudo: ' . $key . ' -*- Evo: ' . $value . ' <br />';
		}
		echo "<br/>";
	}
?>






_____________________________________________________________________________
Premier problème: résolu !
Bonsoir,
voilà maintenant un pti' moment que je patauge dans mon code.
J'aimerai juste trier mon tableau classement en fonction de l'évo' (plus grande à la plus petite)

Un conseil, une remarque, une aide, svp. Smiley decu

<?php
	$id=1;
	$page = file_get_contents("http://www.shinobi.fr/index.php?page=classement&village=gensou&p=1");
	$found1 = (int) preg_match_all('#<td class="nom">(.*)</td>#isU', $page, $pseudo, PREG_PATTERN_ORDER);
	$found2 = (int) preg_match_all('#<td class="droite evolution">(.*)</td>#isU', $page, $evo, PREG_PATTERN_ORDER);
	
	$classement = array_merge((array)$pseudo, (array)$evo);
	
	array_multisort($classement[0], SORT_STRING,
					$classement[2], SORT_NUMERIC, SORT_DESC);
					
	print_r($classement);
	echo "<br/><br/>";
	for($pl=0; $pl<min(20, $found1, $found2); $pl++){
        printf('Pseudo: %s -*- Evo: %s <br/>', $classement[0][$pl], $classement[2][$pl]);
    }
?>

Modifié par ekke (17 May 2012 - 03:49)
Bonjour,
Je suppose que les pseudos doivent se classer selon l'évo ?
Quelque chose comme ceci ne fonctionnerait-il pas ?
$classement = array();
$nb = count($pseudo);
for ($i = 0; $i < $nb; $i++)
    $classement[$pseudo[$i]] = $evo[$i];
sort($classement);
foreach($classement as $key => $value)
    echo 'Pseudo: ' . $key . ' -*- Evo: ' . $evo . ' <br />';
Bonjour,
je te remercie de ton aide.
Au final, j'ai utilisé la fonction array_combine()

<?php
$page = file_get_contents("http://www.shinobi.fr/index.php?page=classement&village=gensou&p=$id");
$found1 = (int) preg_match_all('#<td class="nom">(.*)</td>#isU', $page, $pseudo, PREG_PATTERN_ORDER);
$found2 = (int) preg_match_all('#<td class="droite evolution">(.*)</td>#isU', $page, $evo, PREG_PATTERN_ORDER);

	
$classement = array_combine($pseudo[0], $evo[1]);
arsort($classement);
	

foreach($classement as $key => $value){
	echo 'Pseudo: ' . $key . ' -*- Evo: ' . $value . ' <br />';
}
?>


Cela fonctionne: problème résolu.
Modifié par ekke (16 May 2012 - 11:45)
On découvre des fonctions chaque jour dans PHP...
En revanche, dans la page du manuel de arsort, ça trie le tableau par clé et non par valeur, ne voulais-tu pas les trier en fonction de leur valeur ?
Encore un besoin d'aide ^^'
La fonction PHP array-multisort() trie bien le tableau multi dimension
mais il trie dimension par dimension.

Serait-il possible de trier un tableau multidimensionnel toutes ses dimensions compris et non une à une ?

Mon code est opérationnel. il donne un aperçu, pour mieux comprendre... :

<?php
	$id=1; $pages=5;
	for($id=1; $id<$pages; $id++){
		//Récupère les valeurs des pages.
		$page = file_get_contents("http://www.shinobi.fr/index.php?page=classement&village=gensou&p=$id");
		$found1 = (int) preg_match_all('#<td class="nom">(.*)</td>#isU', $page, $pseudo[$id], PREG_PATTERN_ORDER);
		$found2 = (int) preg_match_all('#<td class="droite evolution">(.*)</td>#isU', $page, $evo[$id], PREG_PATTERN_ORDER);
		$classement[$id] = array_combine($pseudo[$id][0], $evo[$id][1]);
		arsort($classement[$id]);
		foreach($classement[$id] as $key => $value){
			echo 'Pseudo: ' . $key . ' -*- Evo: ' . $value . ' <br />';
		}
		echo "<br/>";
	}
?>

Modifié par ekke (16 May 2012 - 14:16)
Après des heures de recherches, j'ai finalement trouver le moyen de faire simplement:
$array += array_combine(array1, array2);
dans une boucle.

Du coup, bye-bye le multidimensionnel. Je me retrouve avec un beau tableau simple. Et donc facile à trier pour l'utilisation que je veux en faire.



<?php
	$id=1; $pages=10; $classement=array();
	for($id=1; $id<$pages; $id++){
		if($pages !== false) {
			//Récupère les valeurs de la page.
			$page = file_get_contents("http://www.shinobi.fr/index.php?page=classement&village=gensou&p=$id");
			$found1 = (int) preg_match_all('#<td class="nom">(.*)</td>#isU', $page, $pseudo[$id], PREG_PATTERN_ORDER);
			$found2 = (int) preg_match_all('#<td class="droite evolution">(.*)</td>#isU', $page, $evo[$id], PREG_PATTERN_ORDER);
			//Assemble les valeurs $pseudo et $evo
			$classement += array_combine($pseudo[$id][0], $evo[$id][1]);
		}
	}
	//Trie le tableau par ordre décroissant (plus grand au plus petit)
	arsort($classement);
	//affiche les 10 premiers
	$cpt = 0;
	foreach($classement as $key => $value){
		echo $key . ' &nbsp; ' . $value . ' <br />';
		$cpt++;
		if($cpt == 10){
			break;
		}
	}
?>

Modifié par ekke (17 May 2012 - 03:51)