Page 1 sur 2

Demande pour array

Posté : 26 oct. 2013, 09:53
par bibi2410
Bonjour,

Je sais que ma demande est un peu osée mais je suis perdu complet. ça fait des heures que je cherche, j'ai lu un nombre incalculable de forum et tutos, fait des tests mais nop, ça veut pas rentrer: j'ai vraiment du mal avec les array, multisort et tout ce qui va avec. ^^

J'aimerai réaliser un tableau de cette forme:

Image

Dans ce tableau:
- les valeurs "c1 à c10" sont un texte brut,
- les valeurs "v1 à v10" sont des données variables provenant d'un formulaire,
- les valeurs "t1 à t10" sont des données variables provenant d'un formulaire,
- les valeurs "d1 à d10" sont des données variables en heures HH:MM:SS

Je souhaiterai que le tableau soit classé en fonction de la colonne 4 (celle avec les horaires) du plus petit au plus long.
Ces valeurs temps sont calculées par soustraction depuis une autre page, pas de base de données.

Pour info je suis un noob, j'essai juste de faire un truc auquel je ne comprends rien. :(
Que faire ? Help me please. :)

Re: Demande pour array

Posté : 26 oct. 2013, 10:44
par bibi2410
En gros faire comme sur cette page mais en utilisant des données qui ne viennent pas d'une bdd: seebz

Re: Demande pour array

Posté : 26 oct. 2013, 10:50
par moogli
Salut,

On a pas assez de données pour t'aider correctement.

Tout ce que je peu te dire c'est que tu as forcément une relation entre les quatre données et que c'est ce qui va te permettre d'afficher des lignes cohérentes.

Par contre pour le tri tu va devoir créer une fonction de tri perso il n'en existe pas qui le font en php nativement.

@+

Re: Demande pour array

Posté : 26 oct. 2013, 11:36
par bibi2410
il manque quoi comme info ?

Re: Demande pour array

Posté : 26 oct. 2013, 12:13
par bibi2410
Voici quelques infos de correspondance si ça peut aider:

Colonne 1:
du texte
colonne 2:
v1 correspond à <?php echo $_POST['v1']; ?>
v2 correspond à <?php echo $_POST['v2']; ?>
v3 correspond à <?php echo $_POST['v3']; ?>
etc...
colonne 3:
t1 correspond à <? echo "".$my_strh1."";
                  @$date1 = getdate($h1);  ?>
t2 correspond à <? echo "".$my_strh2."";
                  @$date2 = getdate($h2);  ?>
t3 correspond à <? echo "".$my_strh3."";
                  @$date3 = getdate($h3);  ?>
colonne 4:
d1 correspond à ceci: echo strftime("%H:%M:%S",$a1);
d2 correspond à ceci: echo strftime("%H:%M:%S",$a2);
d3 correspond à ceci: echo strftime("%H:%M:%S",$a3);
etc...

Re: Demande pour array

Posté : 26 oct. 2013, 12:45
par bibi2410
après même si ya des variables bidon c'est pas gênant je me debrouillerai plus tard: le principal c'est d'avoir la base.

Re: Demande pour array

Posté : 26 oct. 2013, 13:18
par bibi2410
Donc j'ai réussi à faire ceci, seulement 2 problème pour commencer:
1/ comment ne laisser QUE le texte ? (virer le array et les crochets et tout)
2/ j'ai tester de classer par la colonne "lieu", mais seulement cette colonne est classée. Hors je voudrais que le tri par colonne prenne en charge la ligne entière.

A noter que pour les tests j'ai pris des valeurs texte, Voici mon code actuel:
<?php
$array2 = array (
	array('test'=>'Test n°1', 'lieu'=>'Lieu n°1', 'trajet'=>'Durée n°1', 'depart'=>'Départ n°1' ),
	1 => array('test'=>'Test n°2', 'lieu'=>'Lieu n°2', 'trajet'=>'Durée n°2', 'depart'=>'Départ n°2' ),
	2 => array('test'=>'Test n°3', 'lieu'=>'Lieu n°3', 'trajet'=>'Durée n°3', 'depart'=>'Départ n°3' ),
	3 => array('test'=>'Test n°4', 'lieu'=>'Lieu n°4', 'trajet'=>'Durée n°4', 'depart'=>'Départ n°4' ),
	4 => array('test'=>'Test n°5', 'lieu'=>'Lieu n°5', 'trajet'=>'Durée n°5', 'depart'=>'Départ n°5' ),
	5 => array('test'=>'Test n°6', 'lieu'=>'Lieu n°6', 'trajet'=>'Durée n°6', 'depart'=>'Départ n°6' ),
	6 => array('test'=>'Test n°7', 'lieu'=>'Lieu n°7', 'trajet'=>'Durée n°7', 'depart'=>'Départ n°7' ),
	7 => array('test'=>'Test n°8', 'lieu'=>'Lieu n°8', 'trajet'=>'Durée n°8', 'depart'=>'Départ n°8' ),
	8 => array('test'=>'Test n°9', 'lieu'=>'Lieu n°9', 'trajet'=>'Durée n°9', 'depart'=>'Départ n°9' ),
	9 => array('test'=>'Test n°10', 'lieu'=>'Lieu n°10', 'trajet'=>'Durée n°10', 'depart'=>'Départ n°10' ),
	);



foreach($array2 as $key1 => $row1)
	{ $test[$key1]  = $row1['test']; }
foreach($array2 as $key2 => $row2)
	{ $lieu[$key2]  = $row2['lieu']; }
foreach($array2 as $key3 => $row3)
	{ $trajet[$key3]  = $row3['trajet']; }
foreach($array2 as $key4 => $row4)
	{ $depart[$key4]  = $row4['depart']; }

array_multisort($lieu, SORT_ASC, $array2); 
 
  echo "<TABLE cellpadding=5 cellspacing=0 align=center border=1>";
	echo "<TR>";
		echo "<TD colspan=4 ></TD>";
	echo "</TR>";
	echo "<TR>";
			echo "<TD>";
			print_r($test);
			echo "</TD>";
		echo "<TD>";
		print_r($lieu);
		echo "</TD>";
			echo "<TD>";
			print_r($trajet);
			echo "</TD>";
		echo "<TD>";
		print_r($depart);
		echo "</TD>";
	echo "</TR>";
  echo "</TABLE>";

?>
Voici ce que ça donne en image:

Image

Re: Demande pour array

Posté : 26 oct. 2013, 14:13
par bibi2410
Pour n'afficher que le contenu j'ai remplacer "print_r" par un implode, donc good.

Concernant l'ordre des lignes par colonnes, j'ai remplacé:
array_multisort($lieu, SORT_ASC, $array2);
par:
array_multisort($test, $lieu, $trajet, $depart, SORT_ASC, $array2);

ça permet aux 4 colonnes d'être triées mais soucis, je crois que ça me les range par ordre croissant individuellement, alors que je souhaiterai quand la colonne 4 est triée, toutes les lignes de la colonne suivent. :/

Donc j'en suis là: comment trier toutes les ligne d'un coup en fonction d'une colonne ?

Re: Demande pour array

Posté : 26 oct. 2013, 17:00
par sirakawa
Simulation:
<html>
<form method = 'post' action = 'test.php'>
<table border='1'>
	<tr>
		<th>Colonne 2</th>
		<th>Colonne 3</th>
	</tr>
	<tr>
		<td><input type = 'text' name = 'col2[]' /></td>
		<td><input type = 'text' name = 'col3[]' /></td>
	</tr>
	<tr>
		<td><input type = 'text' name = 'col2[]' /></td>
		<td><input type = 'text' name = 'col3[]' /></td>
	</tr>	
		<tr>
		<td><input type = 'text' name = 'col2[]' /></td>
		<td><input type = 'text' name = 'col3[]' /></td>
	</tr>
</table>
<button type = 'submit'>traiter</button>
</form>
</html>
et début:
<?PHP
error_reporting(E_ALL);
extract($_POST);
$col_dates = array();
$n = count( $col2);
for ($i = 0; $i < $n; $i++)
{
	$col_dates[] = time()+(123*$i);	
}
print "n vaut $n";
print_r($col_dates);
print_r($col2);
$z= array_combine ($col_dates, $col2);
print "<br >";
print_r($z);
asort($z);
print "<br >";
print_r($z);

?>
time() : un timestamp pour aller vite...

Re: Demande pour array

Posté : 28 oct. 2013, 11:52
par bibi2410
ça m'a l'air de fonctionner sur le principe, je vais tenter de l'adapter à mon code ce soir ou demain et je repasse en donner des news. merci. :)

Re: Demande pour array

Posté : 28 oct. 2013, 13:56
par bibi2410
la colonne 2 se met bien dans l'ordre, mais lorsque j'essai d'afficher la colonne 3 celle-ci se met aussi dans l'ordre. Hors il faudrait que les lignes entières se mette dans l'ordre en fonction de la colonne 2. :/

Exemple:

si on a:
colonne 2 | colonne 3
.....4.....|.....a
.....2.....|.....b
.....6.....|.....c

on obtienne:
.....2.....|.....b
.....4.....|.....a
.....6.....|.....c

Mais là j'obtiens 246 et abc (je sais pas si je me suis bien exprimé).

Re: Demande pour array

Posté : 28 oct. 2013, 23:09
par bibi2410
Je viens de trouver cette ceci pour trier les tableaux ligne par ligne en fonction d'une colonne:
$array += array_combine(array1, array2);

Seulement je ne sais pas comment mélanger le tout à des array et au code donné par sirakawa. :/
Quelqu'un pour m'aider svp?

Re: Demande pour array

Posté : 29 oct. 2013, 05:50
par bibi2410
J'ai donc essayé avec ce code d'affichage:
error_reporting(E_ALL);
extract($_POST);
$col_dates = array();
$n = count( $col2);
for ($i = 0; $i < $n; $i++)
{
        $col_dates[] = time()+(123*$i); 
}

// $array += array_combine(array1, array2);

$array3 = array_combine($col2, $col3);
		asort($col2);
		foreach($array3 as $z => $y){
			echo 'col2: ' . $z . ' -- col3: ' . $y . ' <br />';
				}
Mais c'est pire car ça ne se met pas dans l'ordre. :/

Re: Demande pour array

Posté : 29 oct. 2013, 05:59
par bibi2410
Désolé du monologue. lol.
Mais au moins j'essaie de trouver des solutions. :/
Simulation:
<html>
<form method = 'post' action = 'test.php'>
<table border='1'>
	<tr>
		<th>Colonne 2</th>
		<th>Colonne 3</th>
	</tr>
	<tr>
		<td><input type = 'text' name = 'col2[]' /></td>
		<td><input type = 'text' name = 'col3[]' /></td>
	</tr>
	<tr>
		<td><input type = 'text' name = 'col2[]' /></td>
		<td><input type = 'text' name = 'col3[]' /></td>
	</tr>	
		<tr>
		<td><input type = 'text' name = 'col2[]' /></td>
		<td><input type = 'text' name = 'col3[]' /></td>
	</tr>
</table>
<button type = 'submit'>traiter</button>
</form>
</html>
et début:
<?PHP
error_reporting(E_ALL);
extract($_POST);
$col_dates = array();
$n = count( $col2);
for ($i = 0; $i < $n; $i++)
{
	$col_dates[] = time()+(123*$i);	
}
print "n vaut $n";
print_r($col_dates);
print_r($col2);
$z= array_combine ($col_dates, $col2);
print "<br >";
print_r($z);
asort($z);
print "<br >";
print_r($z);

?>
time() : un timestamp pour aller vite...

Mon soucis par rapport à ce code qui m'a bien aidé dans la compréhension de pas mal de choses, c'est que je n'arrive pas à faire le tableau qui va avec. Possible de me guider, m'aider ou autre svp pour ce foutu array qui me fait péter un câble ? :cry:

Re: Demande pour array

Posté : 29 oct. 2013, 10:00
par sirakawa
Mon idée plus en dfétail
Si tu tries sur les temps, tu combines d'abord chaque colonne avec les temps dans dews tableaux différents, tu tries, puis tu extrais les valeurs avec array_data, puis tu recombine les date (au passage tu rconvertis les temps en temps affiches humainement pàar date().