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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] modifier une condition en fonction d'un autre condition

Re: modifier une condition en fonction d'un autre condition

par Saian » 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;
}

Re: modifier une condition en fonction d'un autre condition

par or 1 » 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 ?

Re: modifier une condition en fonction d'un autre condition

par Saian » 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).

Re: modifier une condition en fonction d'un autre condition

par stef31 » 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

Re: modifier une condition en fonction d'un autre condition

par stef31 » 05 mai 2023, 15:18

ok je vais essayer comme ça

Re: modifier une condition en fonction d'un autre condition

par Saian » 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])) {}
}

Re: modifier une condition en fonction d'un autre condition

par stef31 » 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

Re: modifier une condition en fonction d'un autre condition

par Saian » 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...
    }
}

Re: modifier une condition en fonction d'un autre condition

par stef31 » 05 mai 2023, 15:16

non je crois que tu ne comprends pas : je ne connais pas les rows à l'avance, ce qui implique que je ne peux pas écrire ($row1 && $row2)
car pour écrire ($row1 && $row2) il faut avoir qu'il y a 2 $rows seulement

Re: modifier une condition en fonction d'un autre condition

par stef31 » 05 mai 2023, 15:15

Je les ai mis dans une variable qui a cette forme $ligne_a_supprimmer = 5-9-8-25-63;
$sup_lignes = explode("-", $ligne_a_supprimmer);

et puis là je les ai toutes

Re: modifier une condition en fonction d'un autre condition

par Saian » 05 mai 2023, 15:14

foreach ($rows as $row) {
    if ($row['col1quidoitpasetrevide'] !== '' && $row['col2quidoitpasetrevide'] !== '' /* && etc */) {
        // afficher la ligne...
    }
}

Fais un effort au lieu de te braquer.

Re: modifier une condition en fonction d'un autre condition

par stef31 » 05 mai 2023, 15:12

comme je le dis je ne sais pas à l'avance ce que je dois écrire entre les parenthèses (je ne sais pas quelles seront les lignes à enlever c'est aléatoire)

Re: modifier une condition en fonction d'un autre condition

par Saian » 05 mai 2023, 15:12

C'est pas la ligne que tu dois tester ce sont les infos de la ligne... tu les récupères comment ?

Re: modifier une condition en fonction d'un autre condition

par stef31 » 05 mai 2023, 15:11

c'est ce que je souhaite faire et c'est un topic d'aide où je demande comment faire
le problème c'est que je ne peux pas faire quelque chose du genre

$row_test != 0 .= && $row != 12

Re: modifier une condition en fonction d'un autre condition

par Saian » 05 mai 2023, 15:07

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...
    }
}

Sinon
$linesToSkip = [0,1,255];
foreach ($rows as $i => $row) {
    if (!in_array($i, $linesToSkip)) {
        // afficher la ligne...
    }
}