trier un fichier csv

Eléphanteau du PHP | 31 Messages

01 mars 2020, 17:21

Code : Tout sélectionner

<?php. ... $nombre = array (1, 2, 3); $ordre = [ SORT_ASC => 'Ascendant', SORT_DESC => 'Descendant' ]; $col[0] = 36; $ord[0] = SORT_ASC; ... if ( isset($_REQUEST["convert"]) ) { ... // tri du fichier csv /* le tableau $col correspond aux colonnes du tableau csv 0 = prénom 1 = nom 2 = nom complet 36 = catégorie La catégorie sera toujours trié en premier, l'ordre 'prénom, nom, nom complet' est choisi dans le formulaire la colonne '0' correspond à la catégorie Le tableau $ord : tri ascendant ou descendant pour prénom, nom, nom complet. */ $col[$_POST['$_prenom_tri']] = 0 ; $col[$_POST['$_nom_tri']] = 1 ; $col[$_POST['$_nom_complet_tri']] = 2 ; // C'est ici que je patauge // ------------------------------ // comment mettre if (array_key_exists($_POST['order'], $orderOptions)) // chez poi dans le formulaire j'ai : foreach($ordre as $value => $label ) $sort[$_POST['$_prenom_tri']] = $_POST['$_prenom_ord']; $sort[$_POST['$_nom_tri']] = $_POST['$_nom_ord']; $sort[$_POST['$_nom_complet_tri']] = $_POST['$_nom_complet_ord']; ... } if ( !isset($_REQUEST["convert"]) ) { ... 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 $value => $label ){ echo '<option value = "'.$value.'" > '.$label.' </option>'; } echo '</select> <br><br> Tri Nom : <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="'.$nom_ord.'" >'; foreach($ordre as $value => $label ){ echo '<option value = "'.$value.'" > '.$label.' </option>'; } echo '</select> <br><br> Tri Nom Complet : <select name = "$_nom_complet_tri" value="'.$nom_complet_tri.'" >'; foreach($nombre as $select_nbre){ echo '<option value = "'.$select_nbre.'" > '.$select_nbre.' </option>'; } echo '</select> ordre <select name = "$_nom_complet_ord" value="'.$nom_complet_ord.'" >'; foreach($ordre as $value => $label ){ echo '<option value = "'.$value.'" > '.$label.' </option>'; } echo '</select> <br><br> <input type="submit" name="convert" value="trier le fichier csv" style="width: 100%;"> ... }
Dans convert-tri-csv.php

Code : Tout sélectionner

... function convert1($filename_csv, $delimiter1, $col, $ord) { // echo "delimiter : ".$delimiter1."\n"; echo "col : 0- ".$col[0]." 1- ".$col[1]." 2- ".$col[2]." 3- ".$col[3]. "\n"; echo "ord : 0- ".$ord[0]." 1- ".$ord[1]." 2- ".$ord[2]." 3- ".$ord[3]. "\n"; ... // maintenant on trie chaque ligne par catégorie, nom complet, prénom, nom dont la catégorie n'est pas vide $col36values = array_column($categorized, $col[0]); $col0values = array_column($categorized, $col[1]); $col1values = array_column($categorized, $col[2]); $col2values = array_column($categorized, $col[3]); $ord36values = array_column($categorized, $ordl[0]); $ord0values = array_column($categorized, $ord[1]); $ord1values = array_column($categorized, $ord[2]); $ord2values = array_column($categorized, $ord[3]); array_multisort($col36values, $ord36values, $col0values, $ord0values, $col1values, $ord1values, $col2values, $ord2values, $categorized); ...
Quand je vais pour convertir j'ai mis ces 2 lignes pour voir ce qui se passe dans le fichier de sortie

echo "col : 0- ".$col[0]." 1- ".$col[1]." 2- ".$col[2]." 3- ".$col[3]. "\n";
echo "ord : 0- ".$ord[0]." 1- ".$ord[1]." 2- ".$ord[2]." 3- ".$ord[3]. "\n";

ce qui donne

col : 0- 36 1- 2 2- 0 3- 1
ord : 0- 4 1- 2- 3-

Je ne vois rien dans le tableau 'ord' pour les poste 1, 2 et 3.

Comment faire pour visualiser ces postes?

pataugeoire garantie 100%

Avatar du membre
Mammouth du PHP | 1609 Messages

01 mars 2020, 18:08

Tu devrais éviter les $ dans tes noms d'input (select, etc) ça porte à confusion. <select name="prenom_tri"> c'est très bien.
Y a pas d'attribut value sur un select. Il va sur les options du select.
Tu as appelé tes select $_prenom_ord, $_nom_ord, etc, les données sont donc dans $_POST['$_prenom_ord'], $_POST['$_nom_ord'], etc
En se référent à tes variables c'est array_key_exists($_POST['$_prenom_ord'], $ordre), array_key_exists($_POST['$_nom_ord'], $ordre), etc
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 31 Messages

02 mars 2020, 15:14

---
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))
---
Le formulaire

Code : Tout sélectionner

echo '<form method="post" enctype="multipart/form-data"> <BR> <label for="file">Veuillez sélectionner votre fichier.csv puis cliquez sur "trier le fichier csv" :</label> <BR><BR> <input type="file" name="file" id="file" style="width: 100%;"> <BR><BR> field selector : <select name="_delimiter" value="'.$delimiter.'" > <option value="" '.$select_del0.' ></option> <option value="'.$comma.'" '.$select_del1.'>Comma</option> <option value="'.$semicolon.'" '.$select_del2.' >Semicolon</option> <option value="'.$tab.'" '.$select_del3.' >Tab</option> </select><BR><BR> 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 $value => $label ){ echo '<option value = "'.$value.'" > '.$label.' </option>'; } echo '</select> <br><br> Tri Nom : <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="'.$nom_ord.'" >'; foreach($ordre as $value => $label ){ echo '<option value = "'.$value.'" > '.$label.' </option>'; echo '</select> <br><br> Tri Nom Complet : <select name = "_nom_complet_tri" value="'.$nom_complet_tri.'" >'; foreach($nombre as $select_nbre){ echo '<option value = "'.$select_nbre.'" > '.$select_nbre.' </option>'; } echo '</select> ordre <select name = "_nom_complet_ord" value="'.$nom_complet_ord.'" >'; foreach($ordre as $value => $label ){ echo '<option value = "'.$value.'" > '.$label.' </option>'; } echo '</select> <br><br> <input type="submit" name="convert" value="trier le fichier csv" style="width: 100%;"> </form>';

J'ai un tableau que je remplis au premier passage dans le programme

Code : Tout sélectionner

$nombre = array (1, 2, 3); $ordre = [ SORT_ASC => 'Ascendant', SORT_DESC => 'Descendant' ]; $col[0] = 36; $ord[0] = SORT_ASC; if ( !isset($debut) ) { $col[1] = 0; $ord[1] = SORT_ASC; $col[2] = 1; $ord[2] = SORT_ASC; $col[3] = 2; $ord[3] = SORT_ASC; $_SESSION['debut'] = "debut"; // test pour voir ce qu'il y a dans les tableaux $col et $ord echo ' var_dump $col : <br>'; var_dump($col); echo '<br> print_r $col : <br>'; print_r($col); echo '<br><br>'; echo ' var_dump $ord : <br>'; var_dump($ord); echo '<br> print_r $ord : <br>'; print_r($ord); echo '<br><br>'; }
=> résultat

Code : Tout sélectionner

var_dump $col : array(4) { [0]=> int(36) [1]=> int(0) [2]=> int(1) [3]=> int(2) } print_r $col : Array ( [0] => 36 [1] => 0 [2] => 1 [3] => 2 ) var_dump $ord : array(4) { [0]=> int(4) [1]=> int(4) [2]=> int(4) [3]=> int(4) } print_r $ord : Array ( [0] => 4 [1] => 4 [2] => 4 [3] => 4 )
Maintenant je reviens du formulaire que j'ai rempli

Code : Tout sélectionner

if (array_key_exists($_POST['_prenom_tri'], $nombre)) { $tri_prenom = $_POST['_prenom_tri']; } else { echo "<br> post prénom tri, pas bon <br>"; } if (array_key_exists($_POST['_nom_complet_tri'], $nombre)) { $tri_nom_complet = $_POST['_nom_complet_tri']; } else { echo "<br> post nom complet tri, pas bon <br>"; } if (array_key_exists($_POST['_nom_tri'], $nombre)) { $tri_nom = $_POST['_nom_tri']; } else { echo "<br> post nom tri, pas bon <br>"; } echo "<br> colonne affectée avec formulaire <br>"; echo "tri prénom : ".$tri_prenom." \n"; echo "tri nom : ".$tri_nom." \n"; echo "tri nom complet : ".$tri_nom_complet." \n"; echo '<br>'; $col[$tri_prenom] = 0 ; $col[$tri_nom] = 1 ; $col[$tri_nom_complet] = 2 ; echo "<br> valeur des colonnes affectées avec formulaire <br>"; echo "col prénom : ".$col[$tri_prenom]." \n"; echo "col nom : ".$col[$tri_nom]." \n"; echo "col nom complet : ".$col[$tri_nom_complet]." \n"; echo '<br>'; echo "<br> valeur des colonnes affectées avec formulaire par poste du tableau <br>"; echo "col 0 catégorie : ".$col[0]." \n"; echo "col 1 : ".$col[1]." \n"; echo "col 2 : ".$col[2]." \n"; echo "col 3 : ".$col[3]." \n"; echo '<br><br>'; echo ' var_dump $col : <br>'; var_dump($col); echo '<br> print_r $col : <br>'; print_r($col); echo '<br><br>';
résutat :

Code : Tout sélectionner

post nom tri, pas bon colonne affectée avec formulaire tri prénom : 2 tri nom : tri nom complet : 1 valeur des colonnes affectées avec formulaire col prénom : 0 col nom : 1 col nom complet : 2 valeur des colonnes affectées avec formulaire par poste du tableau col 0 catégorie : 36 col 1 : 2 col 2 : 0 col 3 : var_dump $col : array(4) { [0]=> int(36) [2]=> int(0) [""]=> int(1) [1]=> int(2) } print_r $col : Array ( [0] => 36 [2] => 0 [] => 1 [1] => 2 ) valeur des ordres affectées avec formulaire par poste du tableau ord 0 catégorie : 4 ord 1 : 3 ord 2 : 4 ord 3 : var_dump $ord : array(4) { [0]=> int(4) [2]=> string(1) "4" [""]=> string(1) "4" [1]=> string(1) "3" } print_r $ord : Array ( [0] => 4 [2] => 4 [] => 4 [1] => 3 )
3 = SORT_DESC
4 = SORT_ASC

Maintenant j'ai mis descendant pour nom complet

Code : Tout sélectionner

var_dump $col : array(4) { [0]=> int(36) [1]=> int(0) [2]=> int(1) [3]=> int(2) } print_r $col : Array ( [0] => 36 [1] => 0 [2] => 1 [3] => 2 ) var_dump $ord : array(4) { [0]=> int(4) [1]=> int(4) [2]=> int(4) [3]=> int(4) } print_r $ord : Array ( [0] => 4 [1] => 4 [2] => 4 [3] => 4 ) colonne affectée avec formulaire tri prénom : 2 tri nom : 3 tri nom complet : 1 valeur des colonnes affectées avec formulaire col prénom : 0 col nom : 1 col nom complet : 2 valeur des colonnes affectées avec formulaire par poste du tableau col 0 catégorie : 36 col 1 : 2 col 2 : 0 col 3 : 1 var_dump $col : array(4) { [0]=> int(36) [1]=> int(2) [2]=> int(0) [3]=> int(1) } print_r $col : Array ( [0] => 36 [1] => 2 [2] => 0 [3] => 1 ) valeur des ordres affectées avec formulaire par poste du tableau ord 0 catégorie : 4 ord 1 : 3 ord 2 : 4 ord 3 : 4 var_dump $ord : array(4) { [0]=> int(4) [1]=> string(1) "3" [2]=> string(1) "4" [3]=> string(1) "4" } print_r $ord : Array ( [0] => 4 [1] => 3 [2] => 4 [3] => 4 )


Ce qui est bizarre c'est l'affectation dans le tableau $ord avec les string

autre question

if (array_key_exists($_POST['order'], $orderOptions))
pourquoi mettre $orderOptions)
=>
C'est pour comparer $_POST['order'] avec ce qu'il y a dans $orderOptions

J'ai une erreur avec 'post nom tri, pas bon'

Je n'arrive pas à voir l'erreur.
Je vais mettre le formulaire

J'ai fait d'autres tests...
C'est quand je mets 3 comme chiffre

J'ai comme solution 1, 2 ou 3 dans le select du formulaire.
Pour l'instant je ne comprends pas pourquoi 3 ne passe pas

trouvé l'erreur
array_key_exists => in_array

avec in_array cela va mieux :D

Un tableau qui n'a que 3 postes ne peut pas avoir 3 comme clé

Reste encore le tableau avec
var_dump $ord :
array(4) { [0]=> int(4) [1]=> string(1) "3" [2]=> string(1) "4" [3]=> string(1) "4" }

3 = SORT_DESC
4 = SORT_ASC

Au premier passage, je remplis le tableau avec
$col[0] = 36;
$ord[0] = SORT_ASC;

if ( !isset($debut) ) {
$col[1] = 0;
$ord[1] = SORT_ASC;
$col[2] = 1;
$ord[2] = SORT_ASC;
$col[3] = 2;
$ord[3] = SORT_ASC;

=> Cela donne
var_dump $ord :
array(4) { [0]=> int(4) [1]=> int(4) [2]=> int(4) [3]=> int(4) }
print_r $ord :
Array ( [0] => 4 [1] => 4 [2] => 4 [3] => 4 )

Quand je reviens du formulaire
var_dump $ord :
array(4) { [0]=> int(4) [1]=> string(1) "3" [2]=> string(1) "4" [3]=> string(1) "4" }
print_r $ord :
Array ( [0] => 4 [1] => 3 [2] => 4 [3] => 4 )

Avatar du membre
Mammouth du PHP | 1609 Messages

03 mars 2020, 11:37

Oui le formulaire envoie toutes les données sous forme de chaîne. C'est pas très grave, php sait convertir le string en int. Mais tu peux toujours forcer la conversion avec un intval($_POST['ton_input']).

if (array_key_exists($_POST['order'], $orderOptions))
pourquoi mettre $orderOptions)

Parce que dans mon exemple j'avais mis select name="order" et j'avais déclaré :
$orderOptions = [
  SORT_ASC => 'Ascendant',
  SORT_DESC => 'Descendant'
];

Ce qui donne un tableau :
Array ( [4] => 'Ascendant', [3] => 'Descendant' )

Et donc si tu fais un if (array_key_exists($_POST['order'], $orderOptions)) tu peux vérifier que la valeur de $_POST['order'] est bien 3 ou 4 puisque la condition sera false si la valeur n'est pas 3 ou 4 (clé inexistante, les seules clés étant 3 et 4).

PS : Pour un petit programme que tu seras la seule à utiliser, tu t'en fous un peu des tests. Les tests c'est surtout si d'autres personnes sont amenés à utiliser ton programme et d'autant plus si un utilisateur éventuellement mal intentionné essaie de s'en servir. En l'occurrence j'ai pas épluché tout ton code mais je doute que cela puisse être exploité de manière particulièrement dangereuse.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 31 Messages

03 mars 2020, 17:01

Merci d'avoir épluché mon code


J'ai créé 2 tableaux

Code : Tout sélectionner

// tableau pour formulaire $ordre1 = [ $sort2_type => 'Ascendant', $sort1_type => 'Descendant' ]; // tableau pour test retour formulaire $ordre = [ SORT_ASC , SORT_DESC ];
formulaire :

Code : Tout sélectionner

ordre <select name = "_prenom_ord" >'; foreach($ordre1 as $value => $label ){ echo '<option value = "'.$value.'" > '.$label.' </option>'; } echo '</select> <br><br>
test retour du formulaire

Code : Tout sélectionner

if (in_array($_POST['_prenom_ord'], $ordre)) { $ord[$tri_prenom] = $_POST['_prenom_ord']; } else { echo "<br> post prenom_ord, pas bon <br>"; }
Quand je n'avais qu'un tableau, le test pour le retour du formulaire n'était pas bon.

Appel de la fonction pour le tri

Code : Tout sélectionner

... $_SESSION['fichier_name'] = $_FILES["file"]["name"]; $_SESSION['fic_name'] = basename($_SESSION['fichier_name'],".csv"); $destFilepath = 'upload/file.csv'; move_uploaded_file($_FILES['file']['tmp_name'], $destFilepath); $_SESSION['filepath'] = $destFilepath; ... else { $filename_tri_csv = $_SESSION['fic_name']."-tri.csv"; header('Content-Type: text/csv'); header(sprintf('Content-Disposition: attachment; filename="%s"', $filename_tri_csv)); convert1($_SESSION['filepath'],$delimiter,$col,$ord); unlink($_SESSION['filepath']);// supprime le fichier exit; }
Je passe en paramètre : le fichier qui sera trié, le délimiteur du fichier csv, le tableau des colonnes et le tableau des des ordres.

Pour le tri

Code : Tout sélectionner

// Tri du fichier csv function convert1($filename_csv, $delimiter1, $col, $ord) { // voir ce qui arrive de $col, $ord echo "On se trouve dans convert1 \n"; echo "fichier : ".$filename_csv."\n"; echo "delimiter : ".$delimiter1."\n"; echo "col : 0- ".$col[0]." 1- ".$col[1]." 2- ".$col[2]." 3- ".$col[3]. "\n"; echo "ord : 0- ".$ord[0]." 1- ".$ord[1]." 2- ".$ord[2]." 3- ".$ord[3]. "\n"; // Je mets les enregistrements dans un tableau $lines_csv = file($filename_csv); $length = count($lines_csv); // print "length : ".$length."\n"; for($i = 0;$i < $length;$i++) { $keys_csv1 = $lines_csv[$i]; $keys_csv0 = explode($delimiter1,$keys_csv1); $keys_csv0[36] = rtrim($keys_csv0[36]); // on enlève les blancs en fin du dernier poste de chaque ligne $keys_csv[] = $keys_csv0; } // On trie le tableau avec la catégorie : // On met les enregistrements avec la catégorie n'est pas vid puis ceux dont la catégorie est vide. // la ligne d'entête $header = array_shift($keys_csv); // les enregistrements dont la catégorie n'est pas vide $categorized = array_filter($keys_csv, function ($line) { return $line[36]; }); // les enregistrements dont la catégorie est vide pour qu'ils soient en dernier $uncategorized = array_filter($keys_csv, function ($line) { return !$line[36]; }); // maintenant on trie chaque ligne par catégorie, nom complet, prénom, nom dont la catégorie n'est pas vide // selon les colonnes $col36values = array_column($categorized, $col[0]); $col0values = array_column($categorized, $col[1]); $col1values = array_column($categorized, $col[2]); $col2values = array_column($categorized, $col[3]); // selon si descendant ou ascendant $ord36values = array_column($categorized, $ord[0]); $ord0values = array_column($categorized, $ord[1]); $ord1values = array_column($categorized, $ord[2]); $ord2values = array_column($categorized, $ord[3]); // array_multisort($col36values, SORT_ASC, $col0values, SORT_DESC, $col1values, SORT_ASC, $col2values, SORT_ASC, $categorized); array_multisort($col36values, $ord36values, $col0values, $ord0values, $col1values, $ord1values, $col2values, $ord2values, $categorized); // maintenant on trie chaque catégorie par catégorie, nom complet, prénom, nom dont la catégorie est vide // selon les colonnes $col36values = array_column($uncategorized, $col[0]); $col0values = array_column($uncategorized, $col[1]); $col1values = array_column($uncategorized, $col[2]); $col2values = array_column($uncategorized, $col[3]); // selon si descendant ou ascendant $ord36values = array_column($uncategorized, $ord[0]); $ord0values = array_column($uncategorized, $ord[1]); $ord1values = array_column($uncategorized, $ord[2]); $ord2values = array_column($uncategorized, $ord[3]); array_multisort($col36values, SORT_ASC, $col0values, SORT_ASC, $col1values, SORT_ASC, $col2values, SORT_ASC, $uncategorized); // Maintenant on imprime chaque ligne // l'entête $ligne = implode($delimiter1, $header); print "".$ligne."\n"; // chaque ligne avec catégorie non vide foreach($categorized as $line) { $ligne1 = implode($delimiter1, $line); print "".$ligne1."\n"; } // push uncategorized lines foreach($uncategorized as $line) { $ligne1 = implode($delimiter1, $line); print "".$ligne1."\n"; } }
Modifié en dernier par gentil_ecureuil le 03 mars 2020, 17:09, modifié 2 fois.

Avatar du membre
Mammouth du PHP | 1609 Messages

03 mars 2020, 17:06

Quand je n'avais qu'un tableau, le test pour le retour du formulaire n'était pas bon.
Tu n'as pas besoin d'avoir 2 tableaux, si tu utilises les bonnes variables le test est bon.
$ordre = [
  SORT_ASC => 'Ascendant',
  SORT_DESC => 'Descendant'
];

$_POST['ordre'] = 1;

if (!array_key_exists($_POST['ordre'], $ordre))
  echo 'valeur non autorisée';

$_POST['ordre'] = 3;

if (array_key_exists($_POST['ordre'], $ordre))
  echo 'valeur autorisée';
Et ça fonctionne aussi en faisant $_POST['ordre'] = '1'; et $_POST['ordre'] = '3';
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 31 Messages

03 mars 2020, 17:12

Je teste
...
C'est ok.
Je ne sais pas ce que j'avais fait pour avoir 'pas bon' avant.

Code : Tout sélectionner

echo "poste prénom ord : ".$_POST['_prenom_ord']." <br>"; if (array_key_exists($_POST['_prenom_ord'], $ordre1)) { $ord[$tri_prenom] = $_POST['_prenom_ord']; echo "<br> post prenom_ord, c'est ok <br>"; } else { echo "<br> post prenom_ord, pas bon <br>"; }

Code : Tout sélectionner

poste prénom ord : 4 post prenom_ord, c'est ok
Modifié en dernier par gentil_ecureuil le 03 mars 2020, 17:39, modifié 1 fois.

Avatar du membre
Mammouth du PHP | 1609 Messages

03 mars 2020, 17:18

Essaie de bien comprendre la différence entre tableau de base et tableau associatif.
// quand tu déclares 
$array = [ 3, 4 ];
// c'est équivalent à
$array = [
  0 => 3,
  1 => 4
];
// ici évidemment pour tester si 3 ou 4 est bien présent dans le tableau c'est un in_array
var_dump(in_array(3, $array));// true
var_dump(in_array(1, $array));// false

// si ton tableau c'est
$array = [
  3 => 'Descendant',
  4 => 'Ascendant'
];
// 3 et 4 ne sont pas présents dans la tableau qui contient Descendant et Ascendant
// mais 3 et 4 sont les clés du tableau, il faut donc utiliser array_key_exists
var_dump(array_key_exists(3, $array));// true
var_dump(array_key_exists(1, $array));// false
var_dump(in_array(3, $array));// false
var_dump(in_array(1, $array));// false
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 31 Messages

03 mars 2020, 18:48

C'est ok pour les tableaux associatifs
Merci

Le code de la conversion est un peu plus haut.

Mon dernier souci c'est :

Code : Tout sélectionner

// array_multisort($col36values, SORT_ASC, $col0values, SORT_DESC, $col1values, SORT_ASC, $col2values, SORT_ASC, $categorized); array_multisort($col36values, $ord36values, $col0values, $ord0values, $col1values, $ord1values, $col2values, $ord2values, $categorized);
Si je mets la première ligne (celle commenté) cela trie bien les enregistrements du fichier
Le résultat :

Code : Tout sélectionner

On se trouve dans convert1 fichier : upload/file.csv delimiter : ; col : 0- 36 1- 2 2- 0 3- 1 ord : 0- 4 1- 3 2- 4 3- 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 ;;Aprenom6 Anom6;;;;;+33 1 23 45 67 89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;test Aprenom5;Anom5;Aprenom5 Anom5;;;;;;+33 9 87 65 43 21;;;;;;;;;;;;;;;;;;;;;;;;;;;;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 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;;;;;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;;;;;test
Si je mets la deuxième ligne
Le résultat :

Code : Tout sélectionner

fichier : upload/file.csv delimiter : ; col : 0- 36 1- 2 2- 0 3- 1 ord : 0- 4 1- 3 2- 4 3- 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 Aprenom3;Anom3;Aprenom3 Anom3;;;;;;;+33 6 12 34 56 78;;;;;;;;;;;;;;;;;;;;;;;;;;;test Aprenom4;Anom4;Aprenom4 Anom4;;;;;+33 1 23 45 67 89;+33 9 12 34 56 78;+33 6 87 65 43 21;;;;;;;;;;;;;;;;;;;;;;;;;;;test Aprenom5;Anom5;Aprenom5 Anom5;;;;;;+33 9 87 65 43 21;;;;;;;;;;;;;;;;;;;;;;;;;;;;test ;;Aprenom6 Anom6;;;;;+33 1 23 45 67 89;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;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 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;;;;;test
Le tri ne fonctionne pas quand je mets $ord36values,... au lieu de SORT_ASC et SORT_DESC

Anne

Eléphanteau du PHP | 31 Messages

03 mars 2020, 22:07

Trouvé l'annerie.
Maintenant cela fonctionne.

Code : Tout sélectionner

<?php //================= // convert-tri-csv.php //================= // Tri du fichier csv function convert1($filename_csv, $delimiter1, $col, $ord) { // voir ce qui arrive de $col, $ord echo "On se trouve dans convert1 \n"; echo "fichier : ".$filename_csv."\n"; echo "delimiter : ".$delimiter1."\n"; echo "col : 0- ".$col[0]." 1- ".$col[1]." 2- ".$col[2]." 3- ".$col[3]. "\n"; echo "ord : 0- ".$ord[0]." 1- ".$ord[1]." 2- ".$ord[2]." 3- ".$ord[3]. "\n"; var_dump($col); var_dump($ord); /* $ord[1] = SORT_DESC; $ord[2] = SORT_ASC; $ord[3] = SORT_ASC; echo " valeur des ordres affectées avec formulaire par poste du tableau \n"; echo "ord 0 catégorie : ".$ord[0]." \n"; echo "ord 1 : ".$ord[1]." \n"; echo "ord 2 : ".$ord[2]." \n"; echo "ord 3 : ".$ord[3]." \n"; */ print_r($col); print_r($ord); // Je mets les enregistrements dans un tableau $lines_csv = file($filename_csv); $length = count($lines_csv); // print "length : ".$length."\n"; for($i = 0;$i < $length;$i++) { $keys_csv1 = $lines_csv[$i]; $keys_csv0 = explode($delimiter1,$keys_csv1); $keys_csv0[36] = rtrim($keys_csv0[36]); // on enlève les blancs en fin du dernier poste de chaque ligne // echo "colonne 36 : ".$keys_csv0[36]."\n"; // echo "colonne 0 : ".$keys_csv0[0]."\n"; // echo "nbre keys_csv '".count($keys_csv0)."'\n"; $keys_csv[] = $keys_csv0; } // On récupère l'ordre de tri pour chaque colonne if ($ord[0] == "4") { $ord0 = SORT_ASC; } else { $ord0 = SORT_DESC; } if ($ord[1] == "4") { $ord1 = SORT_ASC; } else { $ord1 = SORT_DESC; } if ($ord[2] == "4") { $ord2 = SORT_ASC; } else { $ord2 = SORT_DESC; } if ($ord[3] == "4") { $ord3 = SORT_ASC; } else { $ord3 = SORT_DESC; } // On trie le tableau avec la catégorie : // On met les enregistrements dont la catégorie n'est pas vide en premier puis ceux dont la catégorie est vide. // la ligne d'entête $header = array_shift($keys_csv); // les enregistrements dont la catégorie n'est pas vide $categorized = array_filter($keys_csv, function ($line) { return $line[36]; }); // les enregistrements dont la catégorie est vide $uncategorized = array_filter($keys_csv, function ($line) { return !$line[36]; }); // echo "nbre categorized '".count($categorized)."'\n"; // echo "nbre uncategorized '".count($uncategorized)."'\n"; // maintenant on trie chaque ligne par catégorie, nom complet, prénom, nom dont la catégorie n'est pas vide // selon les colonnes $col36values = array_column($categorized, $col[0]); $col0values = array_column($categorized, $col[1]); $col1values = array_column($categorized, $col[2]); $col2values = array_column($categorized, $col[3]); // array_multisort($col36values, SORT_ASC, $col0values, SORT_ASC, $col1values, SORT_ASC, $col2values, SORT_ASC, $categorized); // array_multisort($col36values, SORT_ASC, $col0values, SORT_DESC, $col1values, SORT_ASC, $col2values, SORT_ASC, $categorized); // array_multisort($col36values, $ord36values, $col0values, $ord0values, $col1values, $ord1values, $col2values, $ord2values, $categorized); array_multisort($col36values, $ord0, $col0values, $ord1, $col1values, $ord2, $col2values, $ord3, $categorized); // maintenant on trie chaque catégorie par catégorie, nom complet, prénom, nom dont la catégorie est vide // selon les colonnes $col36values = array_column($uncategorized, $col[0]); $col0values = array_column($uncategorized, $col[1]); $col1values = array_column($uncategorized, $col[2]); $col2values = array_column($uncategorized, $col[3]); // array_multisort($col36values, SORT_ASC, $col0values, SORT_DESC, $col1values, SORT_ASC, $col2values, SORT_ASC, $uncategorized); array_multisort($col36values, $ord0, $col0values, $ord1, $col1values, $ord2, $col2values, $ord3, $uncategorized); // Maintenant on imprime chaque ligne // l'entête $ligne = implode($delimiter1, $header); print "".$ligne."\n"; // chaque ligne avec catégorie non vide foreach($categorized as $line) { $ligne1 = implode($delimiter1, $line); print "".$ligne1."\n"; } // push uncategorized lines foreach($uncategorized as $line) { $ligne1 = implode($delimiter1, $line); print "".$ligne1."\n"; } } ?>
Si vous voyez quelque chose dans le code...

Anne