[RESOLU] modifier une condition en fonction d'un autre condition

Avatar du membre
Mammouth du PHP | 1609 Messages

05 mai 2023, 15:16

Ben je t'ai déjà donné la solution :
$linesToSkip = [0,1,255];
foreach ($rows as $i => $row) {
    if (!in_array($i, $linesToSkip)) {
        // afficher la ligne...
    }
}
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 17 Messages

05 mai 2023, 15:17

enfin si hypothétiquement je pourrai écrire une condition qui va jusqu'à 1 millions mai ce ne serait pas terrible

Avatar du membre
Mammouth du PHP | 1609 Messages

05 mai 2023, 15:18

Je les ai mis dans une variable qui a cette forme $ligne_a_supprimmer = 5-9-8-25-63;
Et tu l'as rempli comment cette variable ? m'enfin je t'ai quand même donné une solution au dessus.

PS : à noter que le in_array n'est pas idéal si le tableau $linesToSkip contient énormément de lignes. Dans ce cas vaut mieux mettre les valeurs à skip en clés du tableau et faire un !isset.
$linesToSkip = [0,1,255];
$linesToSkip = array_combine($linesToSkip, $linesToSkip);
foreach ($rows as $i => $row) {
    if (!isset($linesToSkip[$i])) {}
}
Modifié en dernier par Saian le 05 mai 2023, 15:29, modifié 6 fois.
Développeur web depuis + de 20 ans

Eléphanteau du PHP | 17 Messages

05 mai 2023, 15:18

ok je vais essayer comme ça

Eléphanteau du PHP | 17 Messages

05 mai 2023, 15:33

Merci à toi j'ai gardé l'idée du in_array, j'ai supprimé le foreach:

if ($row != 0)
{
if (!in_array($row, $linesToSkip)) {
...

( le zero étant l'en tête je le garde quand même )

Merci bien

Avatar du membre
Mammouth du PHP | 1609 Messages

05 mai 2023, 15:38

Plutôt que de faire deux if un seul suffit :
if ($row != 0 && !in_array($row, $linesToSkip)) {
   //...
}

Tu peux même ajouter le 0 à $linesToSkip
$linesToSkip[] = 0;
et te contenter de faire le
if (!in_array($row, $linesToSkip)) {
    //...
}

L'information qui était confuse au départ, même si avec le recul ça paraît évident, était que $row contient le numéro de la ligne (la plupart du temps dans les codes $row est un tableau avec les colonnes de la ligne).
Développeur web depuis + de 20 ans

Mammouth du PHP | 2703 Messages

05 mai 2023, 15:46

Bah dans ce cas pour chaque ligne tu vérifies si ce qui doit être rempli l'est et tu n'affiches la ligne que si c'est le cas.
foreach ($rows as $row) {
    if (/* colx non vide && coly non vide && ... */) {
        // afficher la ligne...
    }
}
stef, pourquoi le code ci-dessus, qui évite de faire 2 boucles quand une seule suffit, n'est pas possible ?

Avatar du membre
Mammouth du PHP | 1609 Messages

05 mai 2023, 16:39

Un exemple de code plus complet. La fonction validateLine peut être modifiée selon la condition souhaitée.

<?php

/* open the file */

if (($handle = fopen('test.csv', 'rb')) === false) {
    echo 'error while opening the file';
    exit;
}

$length = 1024;// 1 ko, increase if lines longer
$separator = ';';// adapt to csv format
$enclosure = '"';// adapt to csv format

/* skip the first line (header) */

fgetcsv($handle, $length, $separator, $enclosure);

/* loop over the rest of the file */

while (($data = fgetcsv($handle, $length, $separator, $enclosure)) !== false) {

    /* skip the line if not valid */

    if (validateLine($data) === false) {
        continue;
    }

    /* do something with $data */

    echo implode(';', $data) . '<br/>';
}

/* close the file */

fclose($handle);

/* function to validate the line */

function validateLine($data): bool
{
    /* let's say we keep the line if at least 80% of the columns are filled */

    $successRate = 0.8;// 0 to 1 for 0% to 100%
    $colsNumber = count($data);

    $colsFilled = 0;
    foreach ($data as $value) {
        if (!empty($value)) {
            ++$colsFilled;
        }
    }

    return $colsFilled / $colsNumber >= $successRate;
}

Développeur web depuis + de 20 ans