php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 31.05.2005, 17:41  
Gast
 
Beiträge: n/a
Standard "PHP reagiert unlogisch!" oder: "Äpfel"

Hallo an alle!

Ich hatte ein Problem, das ich zwar gelöst bekam, aber nicht weiss, warum dieser Lösungsweg funktioniert, geschweige denn, woher dieses Problem rührt. Vielleicht weiss einer der Forumgrößen da ein wenig mehr als ich

Ich definiere die Navigation einer Site wie folgt:

$ADM_DB_CONFIG[key1][key2] = value

PHP-Code:
<?php

$ADM_DB_CONFIG
[0]['alias'] = "Aktuelle Aufgaben";
$ADM_DB_CONFIG[0]['dbase'] = '';
$ADM_DB_CONFIG[0]['link']  = "login.php";
$ADM_DB_CONFIG[0]['class'] = "firstartnavi";
$ADM_DB_CONFIG[0]['identifier'] = 'todo';

$ADM_DB_CONFIG[1]['alias'] = "Artikelverwaltung";
$ADM_DB_CONFIG[1]['dbase'] = '';
$ADM_DB_CONFIG[1]['link']  = "adm_artlist.php";
$ADM_DB_CONFIG[1]['class'] = "firstartnavi";
$ADM_DB_CONFIG[1]['identifier'] = 'artikel';
$ADM_DB_CONFIG[1]['fields'] = 'idnr,einleitung,ueberschrift,ablaufdatum';

$ADM_DB_CONFIG[1usw...
usw...

?>
Mit Hilfe einer Funktion möchte ich an einer anderen Stelle im Projekt den Wert des Schlüssels "key1" anhand eines anderen Wertes "value" ermitteln. Die Funktion ist schnell geschrieben:

PHP-Code:
<?php
0    
1    
foreach ($ADM_DB_CONFIG as $key => $value) {
2        foreach ($value as $second_key => $second_value) {        
3            if ($searched_value == $second_value) {
4                //
5                // Bildschirmausgabe zu Testzwecken
6                echo "$searched_value == $second_value ?
"
;
7                return $key;
8            }
9        }
10    }    
11
?>
Wundersamer Weise bekam ich jedoch ausschließlich den $key = 0 zurück. Noch wundersamer war, dass ich folgende Bildschirmausgabe erhielt: "todo == 1 ?" (Zeile 6)

Und das ist ja eigentlich unmöglich, denn die Zeile 6 soll ja nur ausgeführt werden, wenn $searched_value und $second_value GLEICH sind. Aber der String "todo" ist nun mal nicht das gleiche wie der Wert 1. Genausowenig wie ein Apfel eine Birne ist!

Das Problem ließ sich dadurch lösen, dass ich die beiden Variablen in Zeile 3 in Anführungsstriche setzte:

PHP-Code:
<?php
0    
1    
foreach ($ADM_DB_CONFIG as $key => $value) {
2        foreach ($value as $second_key => $second_value) {        
3            if ("$searched_value" == "$second_value") {
4                //
5                // Bildschirmausgabe zu Testzwecken
6                echo "$searched_value == $second_value ?
"
;
7                return $key;
8            }
9        }
10    }    
11
?>
Das funktioniert wunderbar: Zeile 4-7 werden nur ausgeführt, wenn $searched_value und $second_value tatsächlich den selben Wert enthalten. Warum das so ist, dass würd ich gerne wissen!!

Kann es sein, das eine Variable in PHP mehrere Werte verschiedenen Typs speichern kann? In Dokumentationen steht nichts dergleichen, aber auch nichts, dass dieses "Phänomen" erklärt.

Vielleicht kann mir einer von euch sagen, wo da der Wurm drin ist.
Beste Grüße,

Idefix!
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 31.05.2005, 17:42  
Gast
 
Beiträge: n/a
Standard

Der Titel sollte eigentlich heißen:

"PHP reagiert unlogisch!" oder: "Äpfel"=="Birnen"

Naja... die Sonderzeichen )
  Mit Zitat antworten
Alt 31.05.2005, 18:03  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

auf den ersten blick
return in schleifen ist schwachfug, weil damit die komplette funktion in der du dich befindest zuende ist!!!!
robo47 ist offline   Mit Zitat antworten
Alt 31.05.2005, 18:41  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Das Problem kann ich auch nich nachvollziehen, denn ("todo" == 1) ergibt natürlich false. ("todo" == 0) würde true ergeben, siehe Manual[1].

[1] http://de3.php.net/manual/en/types.comparisons.php

Das immer 0 rauskommt dürfte bei dem abgedruckten Config-Array ja auch korrekt sein - und wenn deine Abfrage immer true ergibt, dann macht das ja eh Sinn.

Gib doch mal hinter deinem if-Statement die beiden Werte mit var_dump() aus.

Im Übrigen wundert es mich sehr, wozu du quasi eine Volltextsuche (oder so ähnlich) über unterschiedliche Konfigurationsparameter brauchst. Das klingt für mich nach einem üblen Workaround..

Basti
Basti ist offline   Mit Zitat antworten
Alt 31.05.2005, 19:50  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von bbastix
Im Übrigen wundert es mich sehr, wozu du quasi eine Volltextsuche (oder so ähnlich) über unterschiedliche Konfigurationsparameter brauchst. Das klingt für mich nach einem üblen Workaround..
Ich hätte es auch nicht so gemacht, das Programm ist nicht von mir. Da ich nur an einem kleinen Modul arbeite, muß ich nun mal die Vorgaben einhalten. Das steht hier allerdings net zur Diskussion.

Zitat:
Zitat von bbastix
(...)denn ("todo" == 1) ergibt natürlich false(...)
Das ist ja genau der Grund weswegen ich dieses Thema eröffnet habe: ("todo" == 1) ergibt in meinem Fall offensichtlich true. An var_dump() hab ich natürlich auch gedacht, Ergebnis: String.

Um mal konkret zu fragen: Können in einer $variable mehrere Datentypen, bzw. mehrere Werte gespeichert werden?!
  Mit Zitat antworten
Alt 31.05.2005, 20:01  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

nennt sich typecasting:
http://www.php.net/manual/en/types.comparisons.php



http://www.phpfriend.de/forum/viewto...ht=comparisons
robo47 ist offline   Mit Zitat antworten
Alt 31.05.2005, 20:23  
Gast
 
Beiträge: n/a
Standard

Teste das mal:

PHP-Code:
<?php
foreach ($ADM_DB_CONFIG as $key => $value) { 
   foreach (
$value as $second_key => $second_value) {       
      if (
$searched_value === $second_value) { 
         echo 
"$searched_value === $second_value ?
"

         return 
$key
      } 
   } 
}
?>
  Mit Zitat antworten
Alt 31.05.2005, 20:27  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von robo47
auf den ersten blick
return in schleifen ist schwachfug, weil damit die komplette funktion in der du dich befindest zuende ist!!!!
Auf den zweiten Blick
korrekt, wenn er den Schlüssel haben will.

Noch korrekter wäre allerdings ein default return false sowie eine Rekursion für Arrays mit mehreren Ebenen.
  Mit Zitat antworten
Alt 31.05.2005, 20:31  
Erfahrener Benutzer
 
Registriert seit: 18.07.2004
Beiträge: 2.162
PHP-Kenntnisse:
Fortgeschritten
Basti
Standard

Zitat:
Zitat von Idefix83
Um mal konkret zu fragen: Können in einer $variable mehrere Datentypen, bzw. mehrere Werte gespeichert werden?!
Nein, eine Variable ist immer genau von EINEM Typ. Allerdings wird der eben bei bestimmten Operationen dynamisch umgewandelt, wie du im Manual[2] nachlesen kannst.

[2] http://www.php.net/manual/en/languag...e-juggling.php

Ich kann das von dir beschriebene Vehalten (erwartungsgemäß) nicht reproduzieren. Dass du den "===" Operator verwenden solltest, dürfte jetzt klar sein.

PHP-Code:
<?php

function compare($config_array$searched_value)
{
    foreach (
$config_array as $key => $value) {
        foreach (
$value as $second_key => $second_value) {      
            if (
$searched_value == $second_value) {
                return 
"\$key = $key ($searched_value == $second_value)\n";
            }
        }
    } 
}

$config_arrays[0][0]['foo'] = 0;
$config_arrays[0][0]['bar'] = 'todo';

$config_arrays[1][0]['foo'] = 1;
$config_arrays[1][0]['bar'] = 'todo';

$config_arrays[2][0]['foo'] = 1;
$config_arrays[2][0]['bar'] = 'nottodo';
$config_arrays[2][1]['foo'] = 0;
$config_arrays[2][1]['bar'] = 'todo';

foreach (
$config_arrays as $config_array)
    echo (
compare($config_array'todo'));

?>
Ergibt bei mir korrekt:

Code:
$key = 0 (todo == 0)
$key = 0 (todo == todo)
$key = 1 (todo == 0)
Basti
Basti ist offline   Mit Zitat antworten
Alt 01.06.2005, 09:26  
Gast
 
Beiträge: n/a
Standard

Okay, alles klar!
Ich hab's verstanden. Wieder was Neues gelernt!!!

Danke für die Tipps, der "==="-Operator wird sich noch als praktisch erweisen!!!

In meiner

PHP-Code:
<?php
if ($searched_value == $second_value)
?>
Zeile wird die Variable $second_value als true interpretiert, wenn sie den Wert 1 enthält, also ist diese Zeile gleichbedeutend mit:

PHP-Code:
<?php
if ("irgendwas" == true)  // was laut Manual true ergibt!
?>
Danke noch mal für die Hilfe, bis zum nächsten Problem!
  Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
if != php unlogisch, php if - schleifen die unlogisch sind aber funktionieren, blick vielleicht unlogisch

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:38 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.