Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

το παρακάτω script μετράει από το 1 έως το 100 και τυπώνει πόσους και ποιους αριθμούς περιέχουν το ψηφίο 9.

 

<?php
$counter=1;

for ($i=1; $i<=100; $i++)  {

if (strchr($i,'9')) {
echo $counter.".".$i."<br>";
$counter++;
}

}
?>

 

αυτό δουλεύει σωστά.

Γιατί όμως φέρνει μόνο ένα αποτέλεσμα αν το βάλουμε να κάνει την ίδια δουλειά με το ψηφίο 0;

Δημοσ.

Επειδή:

if ("0") {
    echo 'YES';
} else {
    echo 'NO';
}

Αν το τρέξεις, θα δεις ότι η απάντηση είναι NO. Αυτό συμβαίνει εξ αιτίας του αυτόματου type casting. Το if περιμένει ως παράμετρο boolean, ενώ εσύ του περνάς string (η strchr επιστρέφει string). Αντί να πετάξει σφάλμα η PHP, κάνει αυτόματα την μετατροπή. Το string 0 μετατρέπεται σε boolean false.

 

Για  ι = 10, 20 κτλ., το strchr(i) επιστρέφει "0". Γιατί; Από τον ορισμό: 

 

 

 

Returns part of haystack string starting from and including the first occurrence of needle to the end of haystack.

 

 Δλδ. το strchr('papari', 'r'), επιστρέφει 'ri'

 

"10" -> "0" -> false

"20" -> "0" -> false

....

"100" -> "00" -> true.

  • Like 2
Δημοσ.

Πολύ σωστά τα λέει ο φίλος, το "0" πρακτικά σημαίνει false.

Δοκίμασε με strpos και είναι ΟΚ.

Όχι, κι αυτό λάθος είναι.

 

Το σωστό είναι κανονικός έλεγχος του return, πχ για strpos με !== false.

Δημοσ.

Όχι, κι αυτό λάθος είναι.

 

Το σωστό είναι κανονικός έλεγχος του return, πχ για strpos με !== false.

 

Πόθεν προέκυψε το "είναι λάθος";

Δημοσ.

Πόθεν προέκυψε το "είναι λάθος";

Αν απλά αντικαταστήσεις τη strchr με strpos είναι λάθος για τον προφανή λόγο που λέει στο μεγάλο κόκκινο warning στο documentation της strpos.

 

Δε νομιζω να εννοούσε αλλαγή της συνάρτησης και ταυτόχρονη προσαρμογή του condition χωρίς να το αναφέρει, γιατί αν γίνει προσαρμογή του condition τότε δε χρειάζεται να αλλάξει η συνάρτηση, το strchr != "" δουλεύει σωστά.

  • Like 1
Δημοσ.

Αν απλά αντικαταστήσεις τη strchr με strpos είναι λάθος για τον προφανή λόγο που λέει στο μεγάλο κόκκινο warning στο documentation της strpos

 

Κατάλαβα λάθος τι έγραψες, sorry.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...