PHP Arrays & Obejekte verstehen

Na deine $row Variable ist ja auch ein <category>-Element, welchen Sinn sollte es da haben nochmal einen Index anzuwenden?
Du musst nur den Inhalt aus der Variable rausholen, wenn ich mich also recht entsinne so:
PHP:
$katname = (string) $row;


Und wegen dem Attributes-Kram von vorher, das geht deutlich einfacher:
PHP:
$katname = (string) $row['id'];
 
Jap so ging das , mitlerwiel habe ich ein neues Problem , ich weiß garnicht ob das überhaupt so einfach lösbar ist .

Meine XML :

Code:
<VerguetungLEAD>
<Standard/>

<discoSURF-KLS-Stick-Aktion>3.00</discoSURF-KLS-Stick-Aktion>
<discoSURF-SML>10.00</discoSURF-SML>
<discoSURF-Push-Aktion>16.00</discoSURF-Push-Aktion><FastSim>20.00</FastSim>

</VerguetungLEAD>

So ich brauche die einzelenen Namen der einträge + den Wert , ich habe es so versucht :

PHP:
     foreach($row->VerguetungLEAD as $rew) {
            $namer = (string) $rew;  
            $wert = $rew->$namer;

            echo "NAME == $namer<br/>";
            }

Aber iwie läuft die schleife nur einmal durch und packt auch nichts in die Variabele rein :(
 
Ich Programmier jetzt schon ziemlich lange , aber ich verstehe Arrays & Obejekte imemrnoch nicht so ganz...

PHP:
     foreach($row->VerguetungLEAD as $rew) {
            $namer = (string) $rew;  
            $wert = $rew->$namer;

            echo "NAME == $namer<br/>";
            }

Ich würde dir mal vorschlagen, dass du dich erstmal ordentlich mit eigenen Objekten auseinander setzt. Hier scheint es ja ständig nur um irgendwelche Spezialproblemchen zu gehen, die du mit dem SimpleXML-Objekt hast. Ich würde aber mal vermuten, dass du - auch wenn dein aktuelles Problem durch jemanden gelöst sein sollte - hinterher noch genauso wenig davon verstehst.

Jedenfalls würde dann nicht so eine Selbstverständlichkeit passieren wie im obigen Codeschnipsel. Du wandelst eine Variable erst explizit in einen String um, um sie danach als Objekt zu verwenden.
Ähm ja, ...:roll:
Du müsstest dann auch von php einen property of a non-object Fehler um die Ohren gehauen bekommen (wenn nicht, wie ist error_reporting() eingestellt?), mit dem sowas auch schon auffallen könnte.

Also wie gesagt: Schau dir OOP mal allgemein an, dann such dir raus wie man auf welche Art auf welche Bausteine im SimpleXML zugreift und dann kannst du es immer wieder auf alle neuen Probleme anwenden.
 
Jetzt bin ich auch nicht schlauer wo genau mein Fehler liegt , das Sting ändert ncihts daran das die Variabele $namer immernoch leer bleibt , und ich habe keine Ahnung wie ich es sonst noch machen könnte ...
 
Es gibt beim Debuggin zwei Zauberfunktionen. Nämlich print_r() und var_dump(), aus optischer Sicht auch gerne in eigenen Funktionen gekapselt (bei mir heißen die print_rr() und var_dumpp()), die einen <pre>-Tag und etwas Farbe drumrum setzen.

Und dann machst du einfach mal diesen da:
PHP:
print_r($row); // 1
print_r($row->VerguetungLEAD); // 2
foreach($row->VerguetungLEAD as $rew) {
  print_r($rew); // 3
  $namer = (string) $rew;  
  $wert = $rew->$namer;
  echo "NAME == $namer<br/>";
}

Bei Strings, (inbesondere bei scheinbar leeren - hier also z.B. bei Nr. 3), bietet sich dann auch immer mal die Variante mit var_dump() an, was bei Array und Objekten aber schnell mal unübersichtlich werden kann.
 
Ja print_r hatte ich shcon gemacht :

PHP:
<pre>";
            print_r($row->VerguetungLEAD);
                   echo"</pre>";

Kommt das raus :

Code:
SimpleXMLElement Object
(
    [Standard] => SimpleXMLElement Object
        (
        )

    [discoSURF-KLS-Stick-Aktion] => 3.00
    [discoSURF-SML] => 10.00
    [discoSURF-Push-Aktion] => 16.00
    [FastSim] => 20.00
)

Ich schätze mal das das Problem am leeren Standrt objekt liegt , bin mir aber nicht sicher....

Zu deinen Funktionen , kannst du mir die mal geben :)
 
Wie sehen denn die Ausgaben an Stelle 3 aus? ;)


Och kein Ding. Ich würde sie zwar heute anders schreiben (z.B. mit backtrace), aber sie hat mir die letzten Jahre schon viel Debugging erleichtert.
PHP:
function print_rr($var, $title = FALSE, $return = FALSE){
  $ret = '<div style=" /*Eigene Styles verwenden!*/ ">'."\n";

  $ret.= '<h1 style="/*Eigene Styles verwenden!*/">';
  $ret.= (is_string($title)) ? 'print_rr('.$title.')' : 'print_rr()';
  $ret.= '</h1>'."\n";

  $ret.= '<pre style="/*Eigene Styles verwenden!*/">'."\n";

  // Kleine var_dump-Anspielung bei einzelnen Variablen
  if ($var === NULL) {
    $var = 'NULL';
  } elseif ($var === TRUE) {
    $var = 'TRUE';
  } elseif ($var === FALSE) {
    $var = 'FALSE';
  }

  $ret.= print_r($var, TRUE); // *
  $ret.= '</pre>'."\n".'</div>'."\n";

  if ($return === TRUE){
    return $ret;
  } else {
    echo $ret;
  }
}

var_dumpp() darfst du dir dann selbst basteln. Nur hat var_dump() keinen Parameter zur Rückgabe, weswegen man die entsprechende Stelle (Siehe Stern) so gestaltet:
PHP:
ob_start()
var_dump($var);
$ret.= ob_get_contents();
ob_end_clean();

Außerdem darfst du dir Farben, Rahmen, Abstände und Schriftgrößen selbst aussuchen.
 
Erstaml vielen Dank für die Funktion , werd ich die Tage bei mir einbauen & anpassen :))

So AHA!

Ich habe mal $rew geprintet, und ich sehe den fehler nur weiß ich nciht warum da nur Standart kommt , ich nehme doch $row->VerguetungLEAD und da ist doch mehr drin als nur Standart :

Code:
SimpleXMLElement Object ( [Standard] => SimpleXMLElement Object ( ) )
 
In $rew soll ja immer nur ein Element aus $row->VerguetungLEAD enthalten sein, das ist schließlich der Sinn der Schleife. Jetzt ist nur noch die Frage, warum die Schleife nur einen Durchlauf liefert, obwohl array_expression (also hier $row->VerguetungLEAD) direkt vor der Schleife mehrere Elemente gezeigt hat. Dann lohnt es sich mal zu überprüfen, ob das in der Schleife nachträglich verändert wird, was ja gerade bei Objekten leicht mal passieren kann.

PHP:
error_reporting(E_ALL & E_STRICT);
$i = 1;
$t = array();
$t[$i] = count($row->VerguetungLEAD);

foreach($row->VerguetungLEAD as $rew) {
  $i = floor($i++);
  $t[$i] = count($row->VerguetungLEAD);

  $namer = (string) $rew;  // A
  $i+=0.01;
  $t[$i] = count($row->VerguetungLEAD);

  $wert = $rew->$namer;  // A
  $i+=0.01;
  $t[$i] = count($row->VerguetungLEAD);

  echo "NAME == $namer<br/>"; // A
  $i+=0.01;
  $t[$i] = count($row->VerguetungLEAD);
}
print_r($t);
Damit hast du vor und nach jeder "Aktion" nachgezählt, wie viele Elemente (noch) vorhanden sind. Alternativ könntest du an den Zählstellen natürlich sofort eine Ausgabe machen.
 
Dein Code gibt das aus :

HTML:
SimpleXMLElement Object ( [Standard] => SimpleXMLElement Object ( ) ) NAME ==
NAME ==
Array ( [1] => 1 )

Aber mal ne andere frage wo sol lden da $rew überschrieben / verändert werden , sehe da nichts
 
Och, man kann ja gar keine Floats als Array-Index verwenden :biggrin:

Um das Ganze mal etwas abzukürzen: SimpleXML

Insbesondere getName() und attributes() solltest du dir mal ansehen ;)
 
PHP:
foreach($row->VerguetungLEAD->children() as $rew) { 	
echo "<pre>";
  $namer = (string) $rew->getName();  
  $wert = $rew;
  echo "NAME == $namer ($wert)<br/>";
}

Danke an alle die bisher geholfen haben :)) So langsam wirds
 
PHP:
foreach($row->VerguetungLEAD->children() as $rew) {     
echo "<pre>";
  $namer = (string) $rew->getName();  
  $wert = $rew;
  echo "NAME == $namer ($wert)<br/>";
}
Danke an alle die bisher geholfen haben :)) So langsam wirds

probier mal die Zeile 5 :p
PHP:
echo "NAME == ".$namer." (".$wert.")</pre><br />";
und evtl solltest du dir auch mal das hier ansehen. Dort wird sehr leicht verständlich die Grundhandhabung von PHP mit mySQL erklärt.
 
Zuletzt bearbeitet:
stimmt schon, aber so ist es schöner zu lesen und anständiger proggrammiert ;)
Ich persönlich verwende nur singlequotes, weshalb ich das so auch gewohnt bin. Mir sagte mal jemand, dass diese schneller geparsed seien. Ob das so ist will ich nicht beschwören.
Aber wie gesagt. Für mich gehört eine anständige Konkatention zu einem sauberen Code


*edit*
hier habe ich etwas darüber gefunden, was es bestätigt :)
 
Zuletzt bearbeitet:
Ich habe mir auch mal angewähnt Singlequotes zu verwenden. Aber ehrlich gesagt dürften die hier das kleinste Problem in Sachen Schönheit und Geschwindigkeit beheben und daher fange ich gar nicht erst an sowas zu erwähnen. ;)