Mehrdimensionales Array

B

BartTheDevil89

Guest
Hallo,

habe ein Problem, bzw. eine Frage.

Und zwar bekommen ich aus simplexml_load_file ja ein mehrdimensionales Array. Mein Problem ist, dass all diese Werte aber utf-8 codiert sind. Also muss ich ja im Prinzip die Werte alles durch utf8_decode() werfen, dass ich sie iso-codiert bekomme.
Aber wie schaffe ich es, dass ich eventuell einfach alle Werte, die in diesem Array sind, durch die Funktion jage? Denn sonst müsste ich ja bei jedem Wert, den ich mir ausgeben lasse, die Funktion nutzen und ich würde das lieber gleich am Anfang einfach mit allen Werten machen.

Danke
 
QUOTE (BartTheDevil89 @ Mo 13.04.2009, 19:29)Mein Problem ist, dass all diese Werte aber utf-8 codiert sind.


Das ist kein Problem, das ist so ideal. Jede ISO-Codierung sollte man seit Jahren vermeiden.



QUOTE (BartTheDevil89 @ Mo 13.04.2009, 19:29)Also muss ich ja im Prinzip die Werte alles durch utf8_decode() werfen, dass ich sie iso-codiert bekomme.


Das wäre ein unsinniges Herangehen.


QUOTE (BartTheDevil89 @ Mo 13.04.2009, 19:29)Aber wie schaffe ich es, dass ich eventuell einfach alle Werte, die in diesem Array sind, durch die Funktion jage? Denn sonst müsste ich ja bei jedem Wert, den ich mir ausgeben lasse, die Funktion nutzen und ich würde das lieber gleich am Anfang einfach mit allen Werten machen.


Schleifen wird man auch in PHP über mehrere Dimensionen laufen lassen können.

Aber das solltest Du nicht machen - sondern stattdessen UTF-8 verwenden.
 
Das Problem ist, dass die Datenbank und die Seite aber schon seit langem mit der iso-Codierung arbeitet. Also ich muss irgendwie diese Daten auch in diese Codierung bringen.
 
Mit welchem Datensatz die Datenbank arbeitet, ist nicht erheblich. In MSQL wird z.B. mit "SET NAMES" der Verbindungszeichensatz festgelegt, so dass man die Daten im passenden Zeichensatz erhält / übergibt.

Um Funktionen über ein Array zu jagen, gibt es noch die Funktionen array_map, array_walk, und array_walk_recursive
 
Also wenn es dir möglich ist, solltest du über eine Umstellung auf UTF-8 nachdenken.
mySql-Dumps anlegen (Create Table und Inserts), jeden Dump-File nach UTF-8 konvertieren, Tabellenstruktur neu anlegen (diesmal UTF-8 Kollationen) und den UTF-8-Dump dann wieder einfügen.
Auf der Webseite ein
CODE
<?php header("Content-Type: text/html; charset=utf-8"); ?>


einfügen und die Datenbank-Klasse entsprechend um

QUOTE
mysql_query("SET NAMES 'utf8'");


bei jedem Connect erweitern.

Damit wärst du für die Zukunft gewappnet ;-)
 
Hi,

ja den Umstieg hab ich auch schon überlegt, aber würde erstmal schauen wollen, dass ich es jetzt auch so hinbekomme. Mein Versuch war jetzt der hier...

CODE
$xml = ERGEBNIS von simpleload...
function set_utf8($item, $key){
utf8_decode($item);
}
$xml = array_walk_recursive($xml, 'set_utf8');



Problem allerdings ist, dass am Ende nurnoch ein "1" rauskommt. Also hab wirklich nurnoch am Ende $xml = 1; obwohl ich vorher ein Array reingeworfen habe.
 
In deiner Funktion fehlt das return :)

CODE
$xml = ERGEBNIS von simpleload...
function set_utf8($item, $key){
   return utf8_decode($item);
}
$xml = array_walk_recursive($xml, 'set_utf8');

 
Achso ja jetzt ganz vergessen....aber leider kommt noch immer nur eine 1 raus^^.....also hier mein Beispiel:

CODE
$xml = simplexml_load_file("$dateiname");

function set_utf8($item, $key){
return utf8_decode($item);
}
echo "<pre>";
print_r($xml);
echo "</pre>";
$xml = array_walk_recursive($xml, 'set_utf8');
echo "<pre>";
print_r($xml);
echo "</pre>";



Und beim ersten echo kommt das Array noch schön brav und beim zweiten ist es dann weg, bzw. eben nurnoch ne 1.
 
Mein fehler, sorry:

CODE

function set_utf8($item, $key){
$item = utf8_decode($item);
}
array_walk_recursive($xml, 'set_utf8');




Nicht return, sondern $item.
Und array_walk_recursive ohne String davor, dann steht das neue Array unter dem alten namen zur Verfügung.
 
simplexml_load_file liefert aber ein Object zurück und kein Array, daher funktioniert das nicht.

Du musst das vor der Ausgabe oder vor dem Speichern in die DB decoden.

Wenn das nicht geht, dann musst du das Object erst in ein Array umwandeln. Im Netz gibt es viele Beispiele dafür.




 
Hi,

also dann versuch ichs doch nochmal:

CODE
 function set_utf8($item, $key){
   $item = utf8_decode($item);
 }
 
 array_walk_recursive($xml, 'set_utf8');
 echo "<pre>";
 print_r($xml);
 echo "</pre>";



Aber auch damit gehts nicht....bzw. die Codierung ändert sich hier nicht.
Die Idee mit der Datenbank ist ganz schön, aber in Folge dieser Datei werden zig verschiedene Datenbankabfragen druchgeführt, also auch where-Anweisungen mit den Daten aus der XML. Deswegen würde ich eben die Daten gern vorher richtig stellen, weil ich sonst ja in jede Abfrage diese "Umcodierung" mit reinbringen müsste.

@connectr: Wann kommt denn dein Basketball Manager online?
 
CODE
function object2array($obj) {
$_arr = is_object($obj) ? get_object_vars($obj) : $obj;
foreach ($_arr as $key => $val) {
$val = (is_array($val) || is_object($val)) ? object2array($val) : $val;
$arr[$key] = utf8_decode($val);
}
return $arr;
}

$myArray = object2array($xml);





@Bart: HaHa, ich hoffe, ich bekomme den noch diesen Sommer fertig ;-)
 
Hi...deine Funktion ist lieb gemeint, aber funktioniert auch nicht wirklich. Also für die ersten Ebene funktionierts auch noch, aber alle Ebenen darunter werden einfach zerlegt. Also print_r bringt halt nurnoch die erste Ebene und dann folgt "Array" als tiefere Ebene. Auch das Auslesen über $xml->Ebene1->Ebene2... bringt kein Ergebnis, also scheint da noch was im argen zu sein.
 
QUOTE (connectR @ Di 14.04.2009, 16:49) *lach* Damn...

Dann nimm diese hier (ganz unten)

Die Funktion ändert jetzt die Codierung. Also es wird schön jetzt die Codierung geändert. Aber leider auch was an der $xml-Form. Denn ich habe anschließend einige foreach-Schleifen, wie die hier:

foreach($xml->data as $data){

Und die melden alle: Warning: Invalid argument supplied for foreach() in....

Also scheint er da jetzt wieder Probleme mit zu haben. Die Funktion ist jetzt die hier:


CODE
$xml = simplexml_load_file("$dateiname");

function xmlObject2Array($knoten){
$xmlArray = array();
if(is_object($knoten)){
settype($knoten,'array')&#59;
}
foreach ($knoten as $key=>$value){
if(is_array($value)||is_object($value)){
$xmlArray[$key] = xmlObject2Array($value);
}else{
$xmlArray[$key] = utf8_decode($value);
}
}
return $xmlArray;
}

$xml = xmlObject2Array($xml);



Bin gespannt auf das Basketball-Ding, denn wirklich gute gibts ja noch nicht.
 
QUOTE (Peter H @ Di 14.04.2009, 17:29) Oder damit per mySQL
http://de.php.net/manual/de/function.mysql-set-charset.php

Damit kannst Du den kompletten Standardzeichensatz nach dem mySQL-Verbindungsaufbau ändern und braucht nicht alle deine Querys zu bearbeiten.
Würde mich jetzt wundern, wenn es damit nicht funktioniert...

Hi...kannst du dazu vielleicht noch was erzählen? Denn hab zwar mir das Manual zu durchgelesen und auch bisschen über Google, aber wirklich die Stelle, an der ich damit arbeiten muss/kann, hab ich noch nicht wirklich gefunden.

Danke
 
Zurück
Oben