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
6 Réponses :
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
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.
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);
?>
<?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);
?>
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']; code > 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']; code > Ç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
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);
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>
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.
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]
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.