2
votes

Comment filtrer le tableau php

J'essaie d'obtenir les valeurs inférieures d'un tableau avec une seule condition comme ci-dessous:

Obtenez toutes les valeurs numériques jusqu'à ce que la valeur suivante soit une chaîne, puis arrêtez l'instruction et laissez toutes les autres valeurs même si elles le sont numérique

<? php   $data= [1,2,3,'web',4,5,6,'web',7,8,9]; ?>

La sortie sera: 7,8,9

php

9 commentaires

Je ne comprends pas la condition. Il semble que votre condition et votre sortie ne correspondent pas. Pourriez-vous reformuler ou ajouter un autre exemple pour que je puisse voir exactement ce que vous essayez de faire?


exécutez votre tableau jusqu'à la dernière valeur entière ??? quelque chose comme ça??


Bonjour, merci pour vos commentaires, mon tableau contient 10 valeurs par exemple: 1,2,3, web, 4,5,6, web, 7,8,9,10 je veux que la sortie soit 10,9,8,7 .


Exécutez votre boucle à partir du bas et vérifiez chaque élément de la méthode ctype_digit, si cela retourne true, continuez sinon quittez le groupe.


maintenant, vous avez plusieurs solutions, avez-vous essayé?


@Badrinath: pas d'accord avec cela, par exemple, si OP demande 1, 2, 3, alors nous devons courir depuis le début ????


Oui ça a marché merci


@ahmedhendah: n'oubliez pas d'accepter la bonne réponse cela aidera le futur visiteur, sinon votre question sera marquée comme ouverte.


votre question est toujours ouverte, si la réponse a résolu votre problème, acceptez-la.


6 Réponses :


0
votes

Vous pouvez utiliser array_reverse pour obtenir des valeurs du tableau avec les éléments dans l'ordre inverse.

foreach($reversed as $value) {
    if(is_string($value)) {
      break;
    }
    $output[] = $value; 
}

//print_r($output); // to print the output array. This will return the values like 9, 8, 7

// do a reverse again to get the values in the format you want.

$final= array_reverse($output);

print_r($final); // to print the final array. This will return the values like 7, 8, 9

puis analysez le tableau pour arrêter là où il obtient une chaîne

$reversed = array_reverse($data);

Voici un DEMO


2 commentaires

Bonjour, ça ne marche pas, le nouveau tableau est toujours vide sans valeurs


Cela fonctionne bien si vous vérifiez le lien de démonstration ou envoyez un nouveau tableau ici pour que je puisse vérifier ce qui ne fonctionne pas.



0
votes

Essayez ceci, ici je stocke les valeurs dans un tableau $ newArray si la valeur est un entier. si une chaîne est trouvée dans la valeur, réinitialisez simplement le tableau $newArray

<?php
$data = [1,2,3,'web',4,5,6,'web',7,8,9,'web','web','web']; 
$newArray = array(); // resultant array
foreach ($data as $key => $value) {
    if(is_int($value) ){
        $newArray[] = $value;
    }    
}
$lastThreeElement = array_values(array_slice($newArray, -3, 3, true));
echo "<pre>";
print_r($lastThreeElement);
?>

DEMO

<?php
$data = [1,2,3,'web',4,5,6,'web',7,8,9,'web']; 
$newArray = array(); // resultant array

end($data);
$keyLast = key($data);  // fetches the key of the element pointed to by the internal pointer

foreach ($data as $key => $value) {
    if(is_int($value) ){
        $newArray[] = $value;
    }
    else{
        if($keyLast === $key) { // if last key is string overwrite the previous array.
            $newArray = $newArray;
        }
        else{
            $newArray = array();    // reset if not integer
        }        
    }
}
echo "<pre>";
print_r($newArray);
?>

Maintenant, vous pouvez utiliser implode () pour un résultat séparé par des virgules, comme:

$data = [1,2,3,'web',4,5,6,'web',7,8,9,'web']; 

Edit: (08-07-2019)

Si Exemple:

echo implode(",",$newArray); // 7,8,9

Code:

Array
(
    [0] => 7
    [1] => 8
    [2] => 9
)

Edit:

Il est préférable de stocker toutes les valeurs entières dans un tableau, puis d'utiliser array_slice () pour obtenir trois éléments du nouveau tableau d'entiers comme:

<?php
$data = [1,2,3,'web',4,5,6,'web',7,8,9]; 
$newArray = array(); // resultant array
foreach ($data as $key => $value) {
    if(is_int($value)){
        $newArray[] = $value;
    }
    else{
        $newArray = array();    // reset if not integer
    }
}
echo "<pre>";
print_r($newArray);
?>


19 commentaires

Cela donnera 1,2,3. Pour la sortie attendue, vous devez d'abord l'inverser.


@Badrinath: vérifier le lien DEMO ... je suis en train de réinitialiser le tableau si une chaîne est trouvée


Bonjour, merci celui-ci a travaillé pour moi


@ahmedhendah: heureux de vous aider, n'oubliez pas d'accepter la réponse, cela aidera les futurs visiteurs.


Bonjour, et si ma table était comme ci-dessous: $ data = [1,2,3, 'web', 4,5,6, 'web', 7,8,9, 'web']; Alors le résultat sera: 7,8,9 Et si le tableau comme ci-dessous: `$ data = [1,2,3, 'web', 4,5,6, 'web' , 7,8,9]; `La sortie sera la même


@ahmedhendah: dans les deux cas, vous obtiendrez la sortie souhaitée


@ahmedhendah: ohh tu as raison, laisse-moi te partager la solution


Cela ne fonctionne pas avec la première condition: $ data = [1,2,3, 'web', 4,5,6, 'web', 7,8,9, 'web']; Ça me donne une erreur


@ahmedhendah: oui vous avez raison, laissez-moi vous partager le code mis à jour


Ok j'attends, thnx


@ahmedhendah: vérifier modifier


@devpro: oui ça marche


@ahmedhendah: ok n'oublie pas d'accepter la réponse en cliquant sur la coche gauche


@devpro: et si ma table était ci-dessous: $ data = [1,2,3, 'web', 4,5,6, 'web', 7,8,9, 'web', 'web' ]; , il n'y a pas de sortie


@ahmedhendah: dans ce cas, le code ne fonctionnera pas, car en raison des 2 derniers index de chaîne


Que faire si je veux considérer de 1 à 4 chaînes? $ data = [1,2,3, 'web', 4,5,6, 'web', 7,8,9]; sortie 7 8 9 $ data = [1 , 2,3, 'web', 4,5,6, 'web', 7,8,9, 'web']; sortie 7 8 9 $ data = [1,2,3 , 'web', 4,5,6, 'web', 7,8,9, 'web', 'web']; sortie 7 8 9 $ data = [1,2,3 , 'web', 4,5,6, 'web', 7,8,9, 'web', 'web', 'web']; outout 7 8 9 $ data = [1 , 2,3, 'web', 4,5,6, 'web', 7,8,9, 'web', 'web', 'web', 'web']; sortie 7 8 9


@ahmedhendah: c'est plus complexe


@ahmedhendah: je vous suggère de stocker une valeur entière dans un tableau puis de choisir les trois derniers chiffres


@ahmedhendah: réponse mise à jour, veuillez vérifier EDIT



0
votes

Nous pouvons essayer de filtrer d'abord pour trouver la première entrée non numérique. Ensuite, sous-ensemble le tableau en commençant par cet index. Enfin, filtrez à nouveau le sous-ensemble pour supprimer tous les éléments non numériques.

Array
(
    [1] => 4
    [2] => 5
    [3] => 6
    [5] => 7
    [6] => 8
    [7] => 9
)

Ceci imprime:

$data= [1,2,3,'web',4,5,6,'web',7,8,9];
$sub_data = array_filter($data, function($item) { return !is_numeric($item); });
$index = array_search(current($sub_data), $data);
$sub_data = array_slice($data, $index);
$sub_data = array_filter($sub_data, function($item) { return is_numeric($item); });
print_r($sub_data);


0 commentaires

0
votes

Je ne sais pas s'il existe une fonction spécifique pour cela mais j'ai obtenu le même résultat avec ce

Array ( [0] => web [1] => 7 [2] => 8 [3] => 9 ) 

Sortie:

$data= [1,2,3,'web',4,5,6,'web',7,8,9];
foreach ($data as $key => $value) {
  if($value=="web"){
    $x =$key;
  }
}
$data = array_slice($data,$x);
print_r($data);

p>


0 commentaires

0
votes

Vous pouvez simplement extraire les valeurs de la fin jusqu'à ce que vous arriviez à quelque chose qui ne soit pas un int.

while (is_int($n = array_pop($data))) {
    $result[] = $n;
}

Cela modifiera le tableau de données, donc si vous devez conserver les valeurs d'origine , puis faites-le avec une copie.


0 commentaires

0
votes

Le test que vous souhaiterez dépendra du fait que vos données d'exemple soient représentatives et que toutes les valeurs numériques que vous souhaitez dans le tableau soient de type int , ou peut-être que certaines peuvent être des chaînes numériques.

$data= [1,2,3,'web',4,5,6,'web',7,8,9];
$result = [];
for($i = count($data)-1; $i >= 0; $i++) {
    // If some of the values you want might be numeric strings
    // (e.g. "7") or decimals (e.g. 1.5), use this
    if(!is_numeric($data[$i])) {
        break;
    }
    // If your values will only be integer type, use this
    if(!is_int($data[$i])) {
        break;
    }
    array_unshift($result,$data[$i]);
}

// If you want the results in original order
print_r($result);  // Output: [7,8,9]

// If you want the results inverted
$result = array_reverse($result);
print_r($result);  // Output: [9,8,7]


0 commentaires