2012-05-30 12 views
6

ich von meiner MySQL-Datenbank
durch Verweis ein Array ändern

Array 
(
[0] => Array 
    (
     [page] => categorypropose 
     [value] => baby-sitters 
     [id] => 357960 
    ) 

[1] => Array 
    (
     [page] => categorysearch 
     [value] => adéquate pour garder 
     [id] => 357961 
    ) 
... 
) 

, ein mehrdimensionales Array Ich habe über eine ‚hausgemachte‘ Funktion „Loadtext zu tun einige ISO-8859-1 zu UTF8 Konvertierung In diesem Array erhalten ".

Aber wenn ich dies tun:

$array = $query->result_array(); 
    foreach($array as &$k) 
    { 
     foreach ($k as &$value) 
     { 
          //Works 
      $value = $this->loadtext($value, 'ISO-8859-1'); 
     } 
    } 
    //Back to normal as $this->loadtext never existed 
    print_r($array); 

Es ist nicht die Änderungen nicht erhalten (Wenn ich $ Wert Echo, es funktioniert, aber die Änderung ist nicht am Ende gehalten ...)

EDIT: Dies ist die Funktion Loadtext, die ich verwenden werde verpflichten (tatsächlich, ich habe es nicht geschafft, aber ich habe es zu benutzen ...)

function loadtext($text,$charset){ 
    $text = stripslashes($text); 
    if($charset!="UTF-8") 
     $text = iconv("UTF-8",$charset,$text); 
    $text = str_replace(" :"," :",$text); 
    $text = str_replace(" ;"," ;",$text); 
    $text = str_replace(" !"," !",$text); 
    $text = str_replace(" ?"," ?",$text); 
    $text = str_replace(" ."," .",$text); 
    $text = str_replace(" …"," …",$text); 
    return $text; 
} 
+0

ich ein paar mehr Debugging Dinge hinzufügen würde - eine 'print_r' und eine andere in der„outter“Schleife. Und testen Sie, ob Sie nur '$ array = array (array (1, 2, 3), array (4, 5, 6))' und '$ value = $ value * 2' zum Testen verwenden. – Raekye

Antwort

6

Sie es so versuchen könnte:

$array = $query->result_array(); 
foreach($array as &$k) 
{ 
    foreach ($k as $i => &$value) 
    { 
         //Works 
     $k[$i] = $this->loadtext($value, 'ISO-8859-1'); 
    } 
} 
//Back to normal as $this->loadtext never existed 
print_r($array); 

Aber noch besser, Sie könnten versuchen, die MySQL-Funktion CONVERT() in Ihrer Abfrage verwenden, so dass die Zeichenfolgen, die Sie zurück erhalten, bereits im UTF8-Format sind.

http://dev.mysql.com/doc/refman/5.0/en/charset-convert.html

Am allerwenigsten, verwenden Sie PHP mb_convert_encoding() statt Ihre selbst gemachten Funktion. Es gibt keinen Grund, das Rad neu zu erfinden.

http://jp2.php.net/manual/en/function.mb-convert-encoding.php

+0

Danke Ich habe deine Methode benutzt. Und ich wusste nicht, dass MySQL die Funktion CONVERT() hatte! Groß ! – Kalzem

+1

Akzeptierte Antwort. Keine Upvotes. Es sollte ein Abzeichen dafür sein. – Okonomiyaki3000

+0

Seltsam, ich dachte, ich hätte das zur gleichen Zeit gemacht = S. Sorry :) – Kalzem

2

fand ich eine einfache Antwort mich die bur mit einer anderen Methode in PHP sehr wellfor mir funktioniert der Wert i von Mysql Ergebnis

 // ur array from mysql  
     $array = $query->result_array(); 


     //try it works 100 % for me just one line of code to modify 
     $result= iconv('UTF-8', 'ASCII//TRANSLIT',$array); 

Quelle erhalten zu ändern: php.net

 // or if doesnt work then u can try like this to modify u can put it inside a foreach loop where you are loopin values 

      $page = array['page']; // to acces that element in the array where to modify 
      $result= iconv('UTF-8', 'ASCII//TRANSLIT',$page);   
+0

In meiner loadtext Funktion manipuliere ich $ Wert individuell wie folgt: "$ text = str_replace (": ","  : ", $ text);". Übrigens wird Ihr zweiter Code die Änderungen am Array $ beibehalten? – Kalzem

+0

es sollte können Sie den Code ausführen und mir sagen, hat es funktioniert oder nicht ya ich denke, der secong-Code sollte funktionieren versuchen print_r ($ Array); und Ausgang; um das Ergebnis zu debuggen bekommen Sie – Rinzler

+0

Seltsamerweise hat es nicht wirklich funktioniert = S. Ich habe schließlich Okonomiyakis Methode benutzt. Immer noch danke für deine Hilfe, ich hab es +;) – Kalzem

0

Es ist mir aufgefallen, dass es eine andere Lösung für dieses spezielle Problem gibt, die das Problem vermeidet, ein Array durch Verweis insgesamt zu modifizieren.

$array = array_map(function ($row) { 
    return array_map(function ($col) { return mb_convert_encoding($col, 'ISO-8859-1'); }, $row); 
}, $query->result_array()); 

Dies verwendet anonyme Funktionen, die erst seit PHP 5.3 so verfügbar sind, wenn Sie etwas älter haben, werden Sie es anders umsetzen müssen, und es ist vielleicht nicht der Mühe wert sein, aber ich denke, es ist ein ziemlich guter Weg, gehen.

Auch kann es effizienter/aussehen sauberer sein es so zu tun:

$colFn = function ($col) { return mb_convert_encoding($col, 'ISO-8859-1'); }; 
$rowFn = function ($row) use ($colFn) { return array_map($colFn, $row); }; 
$array = array_map($rowFn, $query->result_array());