String umwandeln
NetLook
- php
Hallo!
Ich möchte ein Array ausgeben
$Tiefe = "['getCategoryTreeResult']['Nodes']['Category']";
if($action=='getCategoryTree')
{
$Result=$proxy->getCategoryTree($arr_categories);
if($Result['getCategoryTreeResult']['Records']>0)
array2table($Result.$Tiefe,true);
}
Ich hänge $Tiefe an $Result, um bestimmte Arraywerte zu bekommen, was aber nicht funktioniert, wenn ich es so schreiben würde
...
array2table($Result.['getCategoryTreeResult']['Nodes']['Category'],true);
...
funktioniert es. Liegt es daran das $Tiefe ein String ist, wenn ja, wie wandel ich $Tiefe um?
Gruß
NetLook
Hi NetLook!
Liegt es daran das $Tiefe ein String ist, wenn ja, wie wandel ich $Tiefe um?
Spalte den String mit den String-Funktionen oder Regex-Funktionen auf und übergib die drei Arrayschlüssel and das Array.
Brauchst du das häufiger, kannst du eine Funktion schreiben.
Prototyp:
function getvaluefromstring($array,$string) {
// Teile String und lass dir ein Array der verschiedenen Schlüssel ausgeben (z.B. mit explode,substr und strrev oder preg_split)
return $array[$keys[0]][$keys[1]][$keys[2]];
}
MfG H☼psel
Hi, sorry, aber ich kapier das nicht (schäm), ich möchte ja nur statt:
array2table($Result['getCategoryTreeResult']['Nodes']['Category'],true);
array2table($Result.$Tiefe,true);
schreiben können...
Gruß
NetLook
Hi NetLook!
Hi, sorry, aber ich kapier das nicht (schäm), ich möchte ja nur statt:
array2table($Result['getCategoryTreeResult']['Nodes']['Category'],true);
array2table($Result.$Tiefe,true);
schreiben können...
Das geht nur, wenn du die Funktion array2table entsprechend anpasst. Was mir aber dann reichlich unsinnig erscheinen würde.
Warum möchtest du das?
MfG H☼psel
Hi!
Ich möchte das Array solange auslesen, bis es die Letzte Unterkategorie ausgelesen hat. Dafür müssen die Array Keys immer wieder erweitert werden. Der Code oben war nur zum testen, von einem original, damit wollte ich testen in welcher "Schreibweise" es funktioniert.
Hier wie ich es wirklich vorhab:
$Tiefe = "['getCategoryTreeResult']['Nodes']['Category']";
$i=0;
function Abfragen($Tiefe){
foreach($Result.$Tiefe as $ResultWert){
echo "1->: ".$ResultWert."<br>";
if(is_array($ResultWert) && !empty($ResultWert)){
$Tiefe = $Tiefe."[$i]['Nodes']['Category']";
Abfragen($Tiefe);
$i++;
}
else
{
echo "2->: ".$ResultWert."<br>";
}
}
}
Ist $ResultWert also ein Array, wird $Tiefe mit weiteren Array Keys erweitert und die Funktion damit erneut aufgerufen.
Eine andere Möglichkeit habe ich bisher nicht gefunden oder hinbekommen. Die Funktion array2Table habe ich mal verändert, aber habe sie nicht so hinbekommen, das einfach alle Werte nur untereinander geschrieben werden. Zudem verstehe ich auch nicht, wie es hier funktioniert, dass das Array komplett durchgegangen wird, ohne das irgendwo neue Array Keys übergeben werden?!
Hier der Code:
/**
* Translate a result array into a HTML table
*
* @author Aidan Lister <aidan@php.net>
* @version 1.3.1
* @link http://aidanlister.com/repos/v/function.array2table.php
* @param array $array The result (numericaly keyed, associative inner) array.
* @param bool $recursive Recursively generate tables for multi-dimensional arrays
* @param bool $return return or echo the data
* @param string $null String to output for blank cells
*/
function array2table($array, $recursive = false, $return = false, $null = ' ')
{
// Sanity check
if (empty($array) || !is_array($array)) {
return false;
}
if (!isset($array[0]) || !is_array($array[0])) {
$array = array($array);
}
// Start the table
$table = "<table>\n";
// The header
$table .= "\t<tr>";
// Take the keys from the first row as the headings
foreach (array_keys($array[0]) as $heading) {
$table .= '<th>' . $heading . '</th>';
}
$table .= "</tr>\n";
// The body
foreach ($array as $row) {
$table .= "\t<tr>" ;
foreach ($row as $cell) {
$table .= '<td>';
// Cast objects
if (is_object($cell)) { $cell = (array) $cell; }
if ($recursive === true && is_array($cell) && !empty($cell)) {
// Recursive mode
$table .= "\n" . array2table($cell, true, true) . "\n";
} else {
$table .= (strlen($cell) > 0) ?
htmlspecialchars((string) $cell) :
$null;
}
$table .= '</td>';
}
$table .= "</tr>\n";
}
// End the table
$table .= '</table>';
// Method of output
if ($return === false) {
echo $table;
} else {
return $table;
}
}
Gruß
NetLook
Hi NetLook!
Ich möchte das Array solange auslesen, bis es die Letzte Unterkategorie ausgelesen hat.
Um letztendlich was damit zu tun?
Möchtest du eine Tabelle ausgeben, eine Liste oder...?
Ohje... ;-)
// String
$Tiefe = "['getCategoryTreeResult']['Nodes']['Category']";
$i=0;
function Abfragen($Tiefe){
// $Result ist nicht definiert, wenn $Result ein Array wäre,
// dann könntest du es nicht mit einem String verknüpfen.
foreach($Result.$Tiefe as $ResultWert){
echo "1->: ".$ResultWert."<br>";
if(is_array($ResultWert) && !empty($ResultWert)){
$Tiefe = $Tiefe."[$i]['Nodes']['Category']";
Abfragen($Tiefe);
$i++;
}
else
{
echo "2->: ".$ResultWert."<br>";
}
}
}
Ist $ResultWert also ein Array, wird $Tiefe mit weiteren Array Keys erweitert und die Funktion damit erneut aufgerufen.
Das geht aber so nicht.
Ich habe eine Funktion geschrieben, die aus einem Array eine Liste generiert:
function array2list($array,$return = false,$start = true) {
// Liste wird initialisiert
$list = '';
if($start) {
// Anfang und Ende der Liste
$list = "<ul>\n".array2list($array,$return,false)."</ul>";
} else {
// Wenn Array leer ist, wird abgebrochen
if(!empty($array)) {
// Wenn der Wert $array ein Array ist,
// wird dir Funktion rekursiv aufgerufen
if(is_array($array)) {
foreach($array as $node)
$list .= array2list($node,$return,false);
return $list;
// Listenpunkt wird zurückgegeben
} else {
$list .= "\t<li>".$array."</li>\n";
return $list;
}
}
}
// Ausgabe/Rückgabe der Liste
if($return)
return $list;
else echo $list;
}
Die Funktion array2Table habe ich mal verändert, aber habe sie nicht so hinbekommen, das einfach alle Werte nur untereinander geschrieben werden.
Okay, jetzt nochmal für mich zum mitschreiben: Du möchtest also alle Inhalt von $array in einer Liste untereinander ausgeben?!
Zudem verstehe ich auch nicht, wie es hier funktioniert, dass das Array komplett durchgegangen wird, ohne das irgendwo neue Array Keys übergeben werden?!
Mit der Zeile foreach ($array as $row) {
wird das Array zeilenweise ausgelesen und foreach ($row as $cell) {
greift dann auf die einzelnen Elemente zu.
Allerdings funktioniert das nur bis zu zweidimensionalen Arrays.
Für mehrdimensionale musst du, wie auch bei der Beschreibung der Parameter steht, $recursive=true
angeben.
Ich hoffe, ich konnte helfen.
MfG H☼psel
Yo, vielen Dank für das Script! Jetzt möchte ich noch bestimmte Kategorien rausfiltern, also das z.B. nur die Kategorie "Obst" mit Unterkategorien aufgelistet wird. Mal schauen ob ich es hinbekomme :-)
Gruß
NetLook
Hi NetLook!
Yo, vielen Dank für das Script! Jetzt möchte ich noch bestimmte Kategorien rausfiltern, also das z.B. nur die Kategorie "Obst" mit Unterkategorien aufgelistet wird. Mal schauen ob ich es hinbekomme :-)
Das musst du gar nicht hinbekommen. Rufe die Funktion einfach mit $array['obst']
bzw. $array['foobar'][...]['obst']
auf.
MfG H☼psel
Hi!
Also irgendwie habe ich einen Knoten im Kopf!
Hier ein Teilauszug XML Ausgabe aus der das Array entsteht:
<?xml version="1.0" encoding="utf-8" ?>
- <CategoryTree xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://webservices.affili.net/pdws/">
<Records>236</Records>
<ProgramID>3323</ProgramID>
<Title>xxxxx.de</Title>
<LogoURL />
- <Nodes>
- <Category xsi:type="CategoryTreeNode">
<ID>28952084</ID>
<ParentID>0</ParentID>
<Title>Brenner & Massenspeicher</Title>
- <Nodes>
- <Category xsi:type="CategoryTreeNode">
<ID>28952100</ID>
<ParentID>28952084</ParentID>
<Title>CD-Brenner</Title>
- <Nodes>
- <Category xsi:type="CategoryTreeNode">
<ID>28952101</ID>
<ParentID>28952100</ParentID>
<Title>Firewire CD</Title>
<Nodes />
</Category>
</Nodes>
</Category>
Die Liste ist noch viel länger. Jetzt wollte ich daraus nur die Kategorie "Brenner & Massenspeicher" samt Unterkategorien ausgeben lassen:
echo array2table($Result['getCategoryTreeResult']['Nodes']['Category']['Title']['Brenner & Massenspeicher']'Nodes']['Category']);
Was aber (oh wunder, denn NetLook "proggt" ;-)) nicht funktioniert. Ich habe es nochmals und nochmals überprüft und ich meine es müsste korrekt sein.
Wenn ich:
echo array2table($Result['getCategoryTreeResult']['Nodes']['Category'][0]['Nodes']['Category']);
Funktioniert es, aber ich möchte lieber nach dem Titel gehen, da sich die Position immer mal ändern kann.
Wo ist denn der Fehler???
Gruß
NetLook
Hi NetLook!
echo array2table($Result['getCategoryTreeResult']['Nodes']['Category']['Title']['Brenner & Massenspeicher']'Nodes']['Category']);
Es fehlt ja auch ne Klammer ;-) ^
echo array2table($Result['getCategoryTreeResult']['Nodes']['Category']['Title']['Brenner & Massenspeicher']);
funktioniert wohl nicht?
MfG H☼psel
Hi!
Ne an der Klammer lag es nicht, die war im Code auch gesetzt, ist mir hier beim Eintrag irgendwie entwischt?! So einen Fehler hätte ich dann doch bemerkt ;-)
echo array2table($Result['getCategoryTreeResult']['Nodes']['Category']['Title']['Brenner & Massenspeicher']);
Ne, das funktioniert leider nicht!
Gruß
NetLook
Hi NetLook!
Ne, das funktioniert leider nicht!
Kannst du das Array bzw. den Code mal posten?
Hast mal du versucht, die Funktion rekursiv aufzurufen?
echo array2table($Result['getCategoryTreeResult']['Nodes']['Category']['Title']['Brenner & Massenspeicher'],true);
MfG H☼psel
Hi!
Was gibt eigentlich meine Funktion aus?
Nichts
Ich habe das Array, was aus der XML Datei ensteht mit print_r()
ausgegeben und habe es etwas gegliedert. Ich poste aber nur den Anfang, sonst wird es zu viel, das reicht aber auch zur Übersicht (hoffe ich):
Array ( [getCategoryTreeResult] =>
Array ( [Records] => 236 [ProgramID] => 3323 [Title] => xxxxxx.de [LogoURL] => [Nodes] =>
Array ( [Category] =>
Array ( [0] =>
Array ( [ID] => 28952094 [ParentID] => 0 [Title] => Apple [Nodes] =>
Array ( [Category] =>
Array ( [0] =>
Array ( [ID] => 28952095 [ParentID] => 28952094 [Title] => Garantieverlängerung [Nodes] => ) [1] =>
Array ( [ID] => 28952271 [ParentID] => 28952094 [Title] => iMac [Nodes] => ) [2] =>
Array ( [ID] => 28952140 [ParentID] => 28952094 [Title] => Mac mini [Nodes] => ) [3] =>
Array ( [ID] => 29348420 [ParentID] => 28952094 [Title] => Mac Pro [Nodes] => ) [4] =>
Array ( [ID] => 29053537 [ParentID] => 28952094 [Title] => MacBook [Nodes] => ) [5] =>
Array ( [ID] => 28975379 [ParentID] => 28952094 [Title] => MacBook Pro [Nodes] =>
)
)
)
)
[1] =>
Array ( [ID] => 28952084 [ParentID] => 0 [Title] => Brenner & Massenspeicher [Nodes] =>
Array ( [Category] =>
Array (
[0] =>
Array ( [ID] => 28952100 [ParentID] => 28952084 [Title] => CD-Brenner [Nodes] =>
Array ( [Category] =>
Array ( [ID] => 28952101 [ParentID] => 28952100 [Title] => Firewire CD [Nodes] =>
)
)
)
[1] =>
Array ( [ID] => 28952200 [ParentID] => 28952084 [Title] => DVD Brenner [Nodes] =>
Array ( [Category] =>
Array (
[0] =>
Array ( [ID] => 28952235 [ParentID] => 28952200 [Title] => FireWire DVD [Nodes] =>
)
[1] =>
Array ( [ID] => 28952246 [ParentID] => 28952200 [Title] => USB DVD [Nodes] =>
)
[2] =>
Array ( [ID] => 28952234 [ParentID] => 28952200 [Title] => USB/FireWire DVD [Nodes] =>
)
)
)
)
[2] => ...
Die Funktion rekursiv aufrufen, ähh, ne hab ich nicht, weis jetzt auch nicht wie das gehen soll.
Gruß
NetLook
Hi NetLook!
Was gibt eigentlich meine Funktion aus?
Nichts
Das verstehe ich nicht.
Ich habe das Array, was aus der XML Datei ensteht mit print_r()
ausgegeben und habe es etwas gegliedert. Ich poste aber nur den Anfang, sonst wird es zu viel, das reicht aber auch zur Übersicht (hoffe ich):
Ich wollte eigentlich mit dem Array ein paar Test durchführen.
Die Funktion rekursiv aufrufen, ähh, ne hab ich nicht, weis jetzt auch nicht wie das gehen soll.
Hab ich dir ja geschrieben:
echo array2table($Result['getCategoryTreeResult']['Nodes']['Category']['Title']['Brenner & Massenspeicher'],true);
MfG H☼psel
Hallo!
Das Array verändert sich nicht mehr großartig, es kommen noch weitere Kategorien dazu das ist alles, dafür brauch ich das Megading ja jetzt nicht posten ;-) Ich weis zwar nicht genau, was du testen willst, aber um die richtige Schreibweise für
echo array2table($Result['getCategoryTreeResult']['Nodes']['Category']['Title']['Brenner & Massenspeicher'],true);
rauszufinden reicht das Array, ansonsten kann ich es dir mailen?!
In deiner Funktion wird es doch eh rekursic aufgerufen!?
Gruß
NetLook
Hi NetLook!
[...] ansonsten kann ich es dir mailen?!
Wenn du möchtest, darfst du das: mailto:xong_@gmx.de
MfG H☼psel
Hi NetLook!
Was gibt eigentlich meine Funktion aus?
echo array2list($Result['getCategoryTreeResult']['Nodes']['Category']['Title']['Brenner & Massenspeicher']);
MfG H☼psel