trier un fichier csv

Eléphanteau du PHP | 31 Messages

25 févr. 2020, 12:28

bonjour,

J'ai un fichier vcf qui a été récupéré de nexcloud que j'utilise sur mon serveur pour synchroniser entre autre les contacts avec mon téléphone mobile.

J'ai un téléphone gigaset C610ip avec des combinés.
Je peux mettre à jour les contacts de mes téléphones fixes via l'interface web du c610ip.

Je récupère mes contacts avec nexcloud (vcard). Je me retrouve avec un fichier vcf.
J'ai besoin de temps en temps de synchroniser les contacts du téléphone fixe avec ceux de nextcloud.

J'ai trouvé un premier programme php (https://github.com/thomascube/vcfconvert) qui transforme le fichier vcard en csv.
Je l'ai adapté à mes besoins.

Après pour pouvoir comparer les différents répertoires, j'ai fait un script bash qui a entre autre ces lignes pour trier le fichier :
# ecriture de la première ligne qui correspond à la ligne d'entête du fichier csv
head -n1 $fichier_depart > $fichier_retour
# ecriture des autres lignes dont la catégorie n'est pas vide
tail -n+2 $fichier_depart | grep '[A-Za-z0-9]$' | sort -t';' -k37 -k3 -k1 -k2 >> $fichier_retour
# ecriture des autres lignes dont la catégorie est vide
tail -n+2 $fichier_depart | grep '\;$' | sort -t';' -k37 -k3 -k1 -k2 >> $fichier_retour

K37 correspond à la catégorie (famille, amis, contact,...). La catégorie peut être vide.
K1 prénom
K2 nom
k3 nom complet (nom et prénom)

La ligne 'head' écrit la première ligne du fichier csv correspond à l'entête du fichier csv.
La première ligne 'tail' trie les lignes qui ont quelque chose dans catégorie.
La deuxième ligne 'tail' trie les lignes qui non rien dans catégorie.

Cela me permet d'avoir les contacts qui n'ont rien en dernier derrière ceux dont la catégorie n'est pas vide.

Je viens de voir qu'il y a des fonctions spécifiques pour les csv dans php.

Cela vous parait facile d'utiliser php pour faire ce que je fais en bash?

Je viens de tester la ligne de commande en bash pour tester des commandes php.
php mon_script.php avec au début du script #!/usr/bin/php

Vous utilisez souvent en ligne de commande du php?

Merci
Anne

Avatar du membre
Mammouth du PHP | 1609 Messages

25 févr. 2020, 12:42

Cela vous parait facile d'utiliser php pour faire ce que je fais en bash?
Oui, tu peux aisément charger tout le fichier sous forme d'un tableau de tableaux avec par exemple une boucle while et fgetcsv. Ensuite tu peux récupérer la première ligne [0] ou array_shift pour la dépiler du tableau et tu peux filtrer les lignes avec par exemple array_filter.

Vous utilisez souvent en ligne de commande du php?
Plus ou moins, quand je veux un outil à utiliser en ligne de commande ou quand c'est plus pratique que ou qu'il n'est pas utile de passer par le navigateur.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 31 Messages

25 févr. 2020, 13:25

merci

question subsidiaire

Dans le php que j'ai mis sur pastebin ( https://pastebin.com/US7YMg1u ) à la ligne 262, je fais un select pour sélectionner 1 ou plusieurs catégorie.

J'aimerais avoir la même chose mais où je pourrais mettre un chiffre à coté pour le tri.

Cela existe tout fait ce genre de chose en php/html??
Si oui, cela s'appelle comment?
Je n'arrive pas à trouver...

En gros, j'affiche une liste de couleur (blanc, jaune, vert, rouge, bleu, noir)
A coté de jaune je mets 2 et à coté de bleu, je mets 1 et rien à coté des autres.

Merci
Anne

Avatar du membre
Mammouth du PHP | 1609 Messages

25 févr. 2020, 13:43

Bah pas sur de bien comprendre mais il me semble qu'un champ de saisie libre suffirait non ?

EDIT si l'idée est bien de donner un ordre aux catégories tu pourrais t'y prendre de différentes manières.
Une liste des catégories avec pour chacune un champ libre pour mettre le numéro ou autant de listes déroulantes que de catégories et choix de la catégorie 1 sur la première liste déroulante, puis de la deuxième sur la deuxième liste et ainsi de suite.
Pourquoi pas aussi un textarea avec une catégorie par ligne et tu les positionnes dans l'ordre que tu veux par coupé collé...

Sinon y a pas de composant natif html pour ça. Tu peux aussi te tourner vers du javascript avec par exemple le composant sortable de jquery, mais ça demande quand même un certain nombre de connaissances qu'on a pas forcément quand on débute :
https://jqueryui.com/sortable/
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 31 Messages

26 févr. 2020, 22:31

J'ai un peu avancé pour le tri. du fichier csv
#!/usr/bin/php
<?php

// init var
$delimiter = ';';
$data = [];

// load the file in $data
$fileRead = fopen('contacts.csv', 'r');
while ($line = fgetcsv($fileRead, 0, $delimiter))
$data[] = $line;
fclose($fileRead);

// extract hader
$header = array_shift($data);

// extract categorized lines
$categorized = array_filter($data, function ($line) {
return $line[36];
});

// extract uncategorized lines
$uncategorized = array_filter($data, function ($line) {
return !$line[36];
});

// show the results
// var_dump($header);
// var_dump($categorized);
// var_dump($uncategorized);

$col36values = array_column($categorized, 36);
$col0values = array_column($categorized, 0);
$col1values = array_column($categorized, 1);
$col2values = array_column($categorized, 2);

/* array_multisort(
$col36values, SORT_ASC,
$col2values, SORT_ASC,
$col0values, SORT_ASC,
$col1values, SORT_ASC,
$categorized);
marche pas
PHP Parse error: syntax error, unexpected ';', expecting ',' or ')' in /home/anne/sda1/anne/Documents/anne/linux/php/ligne-cde/tri-vcard.php on line 42
*/

array_multisort($col36values, SORT_ASC, $col2values, SORT_ASC, $col0values, SORT_ASC, $col1values, SORT_ASC, $categorized);

// Cela fonctionne . Pourquoi le array_multisort ne fonctionne pas quand il est sur plusieurs lignes

$col36values = array_column($uncategorized, 36);
$col0values = array_column($uncategorized, 0);
$col1values = array_column($uncategorized, 1);
$col2values = array_column($uncategorized, 2);

array_multisort($col36values, SORT_ASC, $col2values, SORT_ASC, $col0values, SORT_ASC, $col1values, SORT_ASC, $uncategorized);

// create the new file
$fileWrite = fopen('contacts-new-4.csv', 'w');

// push header
// fputcsv($fileWrite, $header, $delimiter);
fwrite($fileWrite, implode($delimiter, $header));
fwrite($fileWrite, "\n");

// push categorized lines
foreach($categorized as $line) {
fwrite($fileWrite, implode($delimiter, $line));
fwrite($fileWrite, "\n"); }

// push uncategorized lines
foreach($uncategorized as $line) {
fwrite($fileWrite, implode($delimiter, $line));
fwrite($fileWrite, "\n"); }

fclose($fileWrite);

?>
Anne

Avatar du membre
Mammouth du PHP | 1609 Messages

26 févr. 2020, 23:47

Une fonction pour faire le tri en un appel, comme tu le fais plusieurs fois ça peut simplifier l'écriture :
function listSort($array, $sort, $direction) {
  $args = [];

  for ($i = 0; $i < count($sort); $i++)
    $args = array_merge($args, [
      array_column($array, $sort[$i]),
      $direction[$i]
    ]);

  call_user_func_array('array_multisort', array_merge($args, [ &$array ]));

  return $array;
}

// pour remplacer ça
$col36values = array_column($categorized, 36);
$col0values = array_column($categorized, 0);
$col1values = array_column($categorized, 1);
$col2values = array_column($categorized, 2);

array_multisort($col36values, SORT_ASC, $col2values, SORT_ASC, $col0values, SORT_ASC, $col1values, SORT_ASC, $categorized);

// par ça
$categorized = listSort(
  $categorized,
  [ 36, 0, 1, 2 ],
  [ SORT_ASC, SORT_ASC, SORT_ASC, SORT_ASC ]);

EDIT avec un seul merge :
function listSort($array, $sort, $direction) {
  $args = [];

  for ($i = 0; $i < count($sort); $i++)
    $args[] = [
      array_column($array, $sort[$i]),
      $direction[$i]
    ];

  $args[] = [ &$array ];
  call_user_func_array('array_multisort', array_merge(...$args));

  return $array;
}

Et sans merge, la plus simple en fait ^^ :
function listSort($array, $sort, $direction) {
  $args = [];

  for ($i = 0; $i < count($sort); $i++) {
    $args[] = array_column($array, $sort[$i]);
    $args[] = $direction[$i];
  }

  $args[] = &$array;
  array_multisort(...$args);

  return $array;
}
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 31 Messages

28 févr. 2020, 13:51

merci pour toutes ces informations..

J'ai mis sur mon serveur PHP Software Collections.
Je peux avoir jusqu'à php 7.3.

----
$categorized = listSort(
$categorized,
[ 36, 0, 1, 2 ],
[ SORT_ASC, SORT_ASC, SORT_ASC, SORT_ASC ]);
----

Cette idée me plaît bien.
Je pourrais remplir le tableau selon l'ordre choisi dans un formulaire.
Cela sera facile pour remplir le tableau via un formulaire où je pourrais choisir si tri par nom complet, prénom, nom ou prénom, nom, nom complet ou ...

Il suffit de faire un formulaire qui va bien.

J'ai un peu transformé le php pour le mettre sur mon serveur au lieu de la ligne de commande.
Mais pour les tests, c'est sympa la ligne de commande.

Anne

Eléphanteau du PHP | 31 Messages

28 févr. 2020, 15:18

Je suis en train de regarder pour le formulaire.
Je veux pouvoir choisir dans quel ordre se fera le tri entre nom complet, prénom et nom.
J'ai trouvé cela
----
<label for="nom">Nom :</label>
<input type="number" id="nom" name="nom" min="1" max="3" value="1">
<br>
<label for="prenom">Prénom :</label>
<input type="number" id="prenom" name="prenom" min="1" max="3" value="2">
<br>
<label for="nom_complet">Nom complet :</label>
<input type="number" id="nom_complet" name="nom_complet" min="1" max="3" value="3">
<br><br>
----
Si vous avez d'autres idées...

Je suis en train de regarder pour faire un formulaire pour avoir un tableau directement.
categorie 0
nom 1
prenom 2
nom_complet 3
sachant que categorie sera toujours en premier et immuable.

Donc selon ce qui a été mis dans le formulaire je peux avoir
categorie 0
nom 3
prenom 2
nom_complet 1
et après pour le tri cela devrait être simple

Il va falloir tester si chaque champ est unique. Ne pas se retrouver avec 3 champs avec la même valeur.

Anne
Modifié en dernier par gentil_ecureuil le 28 févr. 2020, 15:54, modifié 2 fois.

Avatar du membre
Mammouth du PHP | 1609 Messages

28 févr. 2020, 15:30

Une autre idée pas trop compliquée, c'est 3 listes déroulantes avec options prénom asc, prénom desc, nom asc, nom desc, ... et on choisit ce qu'on veut dans chaque liste.
Si tu veux faire des choses plus ergonomiques il faudra nécessairement que tu utilises du javascript.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 31 Messages

28 févr. 2020, 15:56

yes

C'est bien plus sympa
----
$nombre = array ("0", "1", "2");
$ordre = array ("SORT_ASC", "SORT_DESC");
----
Nom -tri :
<select name = "$_nom_tri" value="'.$nom_tri.'" >';
foreach($nombre as $select_nbre){
echo '<option value = "'.$select_nbre.'" > '.$select_nbre.' </option>';
}
echo '</select>
ordre
<select name = "$_nom_ord" value="'.$nom1_ord.'" >';
foreach($ordre as $select_ordre){
echo '<option value = "'.$select_ordre.'" > '.$select_ordre.' </option>';
}
echo '</select> <br><br>
----

idem pour prenom et nom_complet

Il faut que je mette cela dans un tableau qui correspondrait à
$categorized = listSort(
$categorized,
[ 36, 0, 1, 2 ],
[ SORT_ASC, SORT_ASC, SORT_ASC, SORT_ASC ]);

36 catégorie
0 prénom
1 nom
2 nom complet

Le premier poste du tableau sera immuable

Eléphanteau du PHP | 31 Messages

29 févr. 2020, 15:52

C'est pour essai pour poster

avec code

Code : Tout sélectionner

zzz
avec list
  • yyyy
avec quote
xxx

Eléphanteau du PHP | 31 Messages

29 févr. 2020, 16:14

php tri-csv-4.php 2020-02-28_17-44_test.csv > 2020-02-28_17-44_test-tri-3-11.csv

php en ligne de commande :
tri-csv-4.php

Code : Tout sélectionner

#!/usr/bin/php <?php $fichier = $argv[1]; // init var $delimiter = ';'; $data = []; // load the file in $data // $fileRead = fopen($fichier, 'r'); while ($line = fgetcsv($fileRead, 0, $delimiter)) $data[] = $line; fclose($fileRead); // extract header $header = array_shift($data); // extract categorized lines $categorized = array_filter($data, function ($line) { return $line[36]; }); // extract uncategorized lines $uncategorized = array_filter($data, function ($line) { return !$line[36]; }); echo "nbre categorized '".count($categorized)."'\n"; echo "nbre uncategorized '".count($uncategorized)."'\n"; // show the results // var_dump($header); // var_dump($categorized); // var_dump($uncategorized); /* $categorized = listSort( $categorized, [ 36, 0, 1, 2 ], [ SORT_ASC, SORT_DESC, SORT_ASC, SORT_ASC ]); $uncategorized = listSort( $uncategorized, [ 36, 0, 1, 2 ], [ SORT_ASC, SORT_DESC, SORT_ASC, SORT_ASC ]); */ $col = array( 36, 2, 0, 1 ); $sort = array( SORT_ASC, SORT_DESC, SORT_ASC, SORT_ASC ); var_dump($col); var_dump($sort); $prenom_tri = 1; $nom_tri = 2; $nom_complet_tri = 3; $prenom_ord = SORT_DESC; $nom_ord = SORT_ASC; $nom_complet_ord = SORT_ASC; $col[$prenom_tri] = $prenom_tri; $col[$nom_tri] = $nom_tri; $col[$nom_complet_tri] = $nom_complet_tri; $sort[$prenom_tri] = $prenom_ord; $sort[$nom_tri] = $nom_ord; $sort[$nom_complet_tri] = $nom_complet_ord; var_dump($col); var_dump($sort); $categorized = listSort( $categorized, $col, $sort); $uncategorized = listSort( $uncategorized, $col, $sort); // Maintenant on imprime chaque ligne // l'entête $ligne = implode($delimiter, $header); print "".$ligne."\n"; // chaque ligne avec catégorie non vide foreach($categorized as $line) { $ligne = implode($delimiter, $line); print "".$ligne."\n"; } // push uncategorized lines foreach($uncategorized as $line) { $ligne = implode($delimiter, $line); print "".$ligne."\n"; } function listSort($array, $sort, $direction) { $args = []; for ($i = 0; $i < count($sort); $i++) { $args[] = array_column($array, $sort[$i]); $args[] = $direction[$i]; } $args[] = &$array; call_user_func_array('array_multisort', array_merge($args, [ &$array ])); return $array; } ?>

fichier de test :
2020-02-28_17-44_test.csv

Code : Tout sélectionner

First Name;Last Name;Display Name;Nickname;E-mail Address;E-mail 2 Address;E-mail 3 Address;Home Phone;Business Phone;Mobile Phone;Home Fax;Business Fax;Pager;Home Street;Home Address 2;Home City;Home State;Home Postal Code;Home Country;Business Address;Business Address 2;Business City;Business State;Business Postal Code;Business Country;Country Code;Related name;Job Title;Department;Organization;Notes;Birthday;Anniversary;Gender;Web Page;Web Page 2;Categories Aprenom1 Anom1;;Aprenom1 Anom1;;[email protected];[email protected];;+33 1 23 45 67 89;+33 2 87 65 43 21;+33 6 12 34 56 78;+33 9 12 34 56 78;+33 9 87 65 43 21;;rue1;rue2;meylan;rhone alpes;38240;france;rue1T;rue2T;Grenoble;isere;38000;france;;;;;;notes;1604-12-08 00:00:00;;;;; Aprenom2;Anom2;Aprenom2 Anom2;;[email protected];[email protected];;+33 1 23 45 67 89;+33 9 12 34 76 78;+33 6 56 78 12 34;;;;rue D;rue D étendue;ville D;paca D;12345;france;rue T;rue T étendue;ville T;paca T;23456;france;;;;;;note lig 1 note lig 2 note lig 3;2020-01-05 00:00:00;;;www.xxx.com;;test Aprenom3;Anom3;Aprenom3 Anom3;;;;;;;+33 6 12 34 56 78;;;;;;;;;;;;;;;;;;;;;;;;;;;test Aprenom5;Anom5;Aprenom5 Anom5;;;;;;+33 9 87 65 43 21;;;;;;;;;;;;;;;;;;;;;;;;;;;; Aprenom4;Anom4;Aprenom4 Anom4;;;;;+33 1 23 45 67 89;+33 9 12 34 56 78;+33 6 87 65 43 21;;;;;;;;;;;;;;;;;;;;;;;;;;;test Aprenom7;Anom7;Aprenom7 Anom7;;;;;+33 1 23 45 67 89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;test ;Aprenom Anom;Aprenom Anom;;[email protected];[email protected];[email protected];+33 9 12 34 56 78;+33 9 87 65 43 21;+33 6 12 56 34 78;+33 8 12 34 56 78;+33 8 87 65 43 21;;rueD;;VILLED;;01234;;rueT;;VilleT;;34567;;;;;;;notes en tout genre AAAAAA aaaaaa;2019-12-18 00:00:00;;;;; ;;Aprenom6 Anom6;;;;;+33 1 23 45 67 89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;test

résutat
2020-02-28_17-44_test-tri-3-11.csv

Code : Tout sélectionner

nbre categorized '5' nbre uncategorized '3' array(4) { [0]=> int(36) [1]=> int(2) [2]=> int(0) [3]=> int(1) } array(4) { [0]=> int(4) [1]=> int(3) [2]=> int(4) [3]=> int(4) } array(4) { [0]=> int(36) [1]=> int(1) [2]=> int(2) [3]=> int(3) } array(4) { [0]=> int(4) [1]=> int(3) [2]=> int(4) [3]=> int(4) } First Name;Last Name;Display Name;Nickname;E-mail Address;E-mail 2 Address;E-mail 3 Address;Home Phone;Business Phone;Mobile Phone;Home Fax;Business Fax;Pager;Home Street;Home Address 2;Home City;Home State;Home Postal Code;Home Country;Business Address;Business Address 2;Business City;Business State;Business Postal Code;Business Country;Country Code;Related name;Job Title;Department;Organization;Notes;Birthday;Anniversary;Gender;Web Page;Web Page 2;Categories Aprenom7;Anom7;Aprenom7 Anom7;;;;;+33 1 23 45 67 89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;test Aprenom4;Anom4;Aprenom4 Anom4;;;;;+33 1 23 45 67 89;+33 9 12 34 56 78;+33 6 87 65 43 21;;;;;;;;;;;;;;;;;;;;;;;;;;;test Aprenom3;Anom3;Aprenom3 Anom3;;;;;;;+33 6 12 34 56 78;;;;;;;;;;;;;;;;;;;;;;;;;;;test Aprenom2;Anom2;Aprenom2 Anom2;;[email protected];[email protected];;+33 1 23 45 67 89;+33 9 12 34 76 78;+33 6 56 78 12 34;;;;rue D;rue D étendue;ville D;paca D;12345;france;rue T;rue T étendue;ville T;paca T;23456;france;;;;;;note lig 1 note lig 2 note lig 3;2020-01-05 00:00:00;;;www.xxx.com;;test ;;Aprenom6 Anom6;;;;;+33 1 23 45 67 89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;test ;Aprenom Anom;Aprenom Anom;;[email protected];[email protected];[email protected];+33 9 12 34 56 78;+33 9 87 65 43 21;+33 6 12 56 34 78;+33 8 12 34 56 78;+33 8 87 65 43 21;;rueD;;VILLED;;01234;;rueT;;VilleT;;34567;;;;;;;notes en tout genre AAAAAA aaaaaa;2019-12-18 00:00:00;;;;; Aprenom5;Anom5;Aprenom5 Anom5;;;;;;+33 9 87 65 43 21;;;;;;;;;;;;;;;;;;;;;;;;;;;; Aprenom1 Anom1;;Aprenom1 Anom1;;[email protected];[email protected];;+33 1 23 45 67 89;+33 2 87 65 43 21;+33 6 12 34 56 78;+33 9 12 34 56 78;+33 9 87 65 43 21;;rue1;rue2;meylan;rhone alpes;38240;france;rue1T;rue2T;Grenoble;isere;38000;france;;;;;;notes;1604-12-08 00:00:00;;;;;
Cela fonctionne
Si quelqu'un veut tester

J'ai dû mal à comprendre comment cela se passe avec ces 2 lignes
$args[] = &$array;
call_user_func_array('array_multisort', array_merge($args, [ &$array ]));

Maintenant je vais tester avec mon serveur

Merci pour tout

Avatar du membre
Mammouth du PHP | 1609 Messages

29 févr. 2020, 16:42

J'ai dû mal à comprendre comment cela se passe avec ces 2 lignes
$args[] = &$array;
call_user_func_array('array_multisort', array_merge($args, [ &$array ]));
En fait t'as fait un mix des différentes fonctions et c'est pas bon comme ça. Coup de chance que tu n'aies pas d'erreur et que ça fonctionne. Il faut prendre la dernière si tu es en php 5.6+

Les ... c'est l'opérateur de décomposition introduit en php 5.6 :
https://www.php.net/manual/fr/migration ... atures.php

Le & c'est du passage par référence :
https://www.php.net/manual/fr/language. ... s.pass.php

Quand tu passes une variable par référence ou que le paramètre est déclaré en référence, alors la variable extérieur à la fonction est directement modifiée par la fonction. La en l'occurrence pour une raison x ou y (en regardant la doc j'ai l'impression que c'est le premier paramètre uniquement qui est déclaré en référence alors que notre tableau est transmis en dernier paramètre) la variable extérieur n'est pas modifée. Il faut donc la passer par référence pour qu'elle le soit car array_multisort ne retourne pas le tableau modifié mais retourne true ou false.

EDIT

La fonction pour php 5.3, en restant au plus simple dans l'écriture (les premiers codes étaient bêtement compliqués avec des merges inutiles), la seule différence c'est qu'il faut passer par call_user_func_array car il n'y a pas l'opérateur ... :
  function listSort($array, $sort, $direction)
  {
    $args = array();

    for ($i = 0; $i < count($sort); $i++) {
      $args[] = array_column($array, $sort[$i]);
      $args[] = $direction[$i];
    }

    $args[] = &$array;
    call_user_func_array('array_multisort', $args);

    return $array;
  }
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 31 Messages

29 févr. 2020, 21:47

Sur mon ordi (debian stretch) je suis avec php 7.0

Sur mon serveur, j'ai installé PHP Software Collections
Donc, je peux être jusqu'à php 7.3 maintenant :? :lol:

----
$categorized = listSort(
$categorized,
[ 36, 0, 1, 2 ],
[ SORT_ASC, SORT_ASC, SORT_ASC, SORT_ASC ]);
----

Ce qui me plaisait avec cela c'est la notion de 2 tableaux

Avec mon serveur, j'ai un souci

Code : Tout sélectionner

$nombre = array (1, 2, 3); //$ordre = array (SORT_ASC, SORT_DESC); // 1 $ordre = array ("SORT_ASC", "SORT_DESC"); // 2 //$ordre = array ('SORT_ASC', 'SORT_DESC'); // 3
Dans le formulaire j'ai

Code : Tout sélectionner

Tri Prénom : <select name = "$_prenom_tri" value="'.$prenom_tri.'" >'; foreach($nombre as $select_nbre){ echo '<option value = "'.$select_nbre.'" > '.$select_nbre.' </option>'; } echo '</select> ordre <select name = "$_prenom_ord" value="'.$prenom_ord.'" >'; foreach($ordre as $select_ordre){ echo '<option value = "'.$select_ordre.'" > '.$select_ordre.' </option>'; } echo '</select> <br><br>
Si je mets le code 2 ou 3, cela s'affiche correctement dans le formulaire.
Si je mets le code 1, C'est du nuùmérique.

Avec le code en ligne de commande, j'ai ce tableau
$sort = array( SORT_ASC, SORT_DESC, SORT_ASC, SORT_ASC );

Comment faire?

Anne

Avatar du membre
Mammouth du PHP | 1609 Messages

01 mars 2020, 02:41

Normal SORT_ASC et SORT_DESC sont des constantes php. La valeur réel c'est celle que tu obtiens en faisant un echo SORT_ASC et c'est effectivement une valeur numérique. Et tu peux donner directement la valeur numérique à la fonction, tu n'es pas obligée d'utiliser la constante.

Donc le genre de chose que tu peux faire c'est ça :
// utiliser un tableau associatif
$orderOptions = [
  SORT_ASC => 'SORT_ASC',
  SORT_DESC => 'SORT_DESC'
];

Pour les options du select dans le formulaire
<select name="order">
<?php foreach ($orderOptions as $value => $label): ?>
  <option value="<?php echo $value; ?>"><?php echo $label; ?></option>
<?php endforeach; ?>
</select>

Ensuite tu peux utiliser directement $_POST['order'] dans le tableau en troisième paramètre de listSort.

Si tu veux valider la valeur de $_POST['order'] (être sur que c'est bien une des valeurs possibles), tu peux faire un
if (array_key_exists($_POST['order'], $orderOptions))

PS : et tu pourrais tout aussi bien déclarer $orderOptions avec des termes compréhensibles pour l'utilisateur lambda :
$orderOptions = [
  SORT_ASC => 'Ascendant',
  SORT_DESC => 'Déscendant'
];
Développeur web depuis + de 20 ans