2012-05-30 19 views
6

द्वारा एक सरणी मैं एक बहुआयामी सरणी
संदर्भ

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

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

मेरी MySQL डेटाबेस से प्राप्त इस सरणी में संशोधित करें, मैं UTF8 रूपांतरण करने के लिए कुछ ISO-8859-1 एक 'घर का बना' समारोह "loadtext के माध्यम से क्या करना है "।

लेकिन जब मैं यह कर:

$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); 

यह परिवर्तन के संरक्षण नहीं करता है (जब मैं $ मूल्य गूंज, यह काम करता है, लेकिन संशोधन अंत में नहीं रखा जाता है ...)

संपादित करें: इस समारोह loadtext है कि मैं का उपयोग करने के उपकृत कर रहा हूँ है (वास्तव में, मैं समय पर नहीं था लेकिन मैं इसे उपयोग करने के लिए है ...)

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

मैं कुछ और डिबगिंग बातें जोड़ना होगा - एक 'print_r' और एक अन्य" outter "लूप के अंदर। और परीक्षण करें कि यदि आप परीक्षण के लिए '$ array = array (सरणी (1, 2, 3), सरणी (4, 5, 6)) और '$ value = $ value * 2' करते हैं तो परीक्षण करें। – Raekye

उत्तर

6

आप इस तरह यह कोशिश कर सकते:

$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); 

लेकिन बेहतर अभी तक, आप अपनी क्वेरी में MySQL फ़ंक्शन CONVERT() का उपयोग करने का प्रयास कर सकते हैं ताकि आपके द्वारा वापस आने वाले तार पहले ही यूटीएफ 8 प्रारूप में हैं।

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

कम से कम, पीएचपी के mb_convert_encoding() बजाय अपने घर का बना समारोह का उपयोग करें। पहिया को फिर से शुरू करने का कोई कारण नहीं है।

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

+0

धन्यवाद मैंने आपकी विधि का उपयोग किया। और मुझे नहीं पता था कि MySQL कनवर्टर() फ़ंक्शन था! महान ! – Kalzem

+1

स्वीकृत उत्तर। शून्य अपवॉट्स। इसके लिए एक बैज होना चाहिए। – Okonomiyaki3000

+0

अजीब, मैंने सोचा कि मैंने एक ही समय में ऐसा किया था = एस। क्षमा करें :) – Kalzem

2

मैं एक साधारण सवाल का जवाब अपने आप को जो

 // 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); 

स्रोत php में एक और पद्धति का उपयोग करके मूल्य मैं mysql परिणाम से प्राप्त बदलने के लिए बर मुझे wellfor बहुत काम करता पाया: 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

मेरे लोडटेक्स्ट फ़ंक्शन में, मैं इस "$ text = str_replace (": ","  : ", $ text) की तरह व्यक्तिगत रूप से $ मान का उपयोग करता हूं;"। वैसे, क्या आपका दूसरा कोड $ सरणी में परिवर्तनों को संरक्षित करेगा? – Kalzem

+0

यह आपको कोड चला सकता है और मुझे बता सकता है कि यह काम करता है या नहीं, मुझे लगता है कि सिकॉन्ग कोड को काम करना चाहिए print_r ($ array); और बाहर निकलें; परिणाम को डीबग करने के लिए आपको – Rinzler

+0

मिल गया है आश्चर्यजनक रूप से यह वास्तव में काम नहीं करता = एस। मैंने अंततः ओकोनोमियाकी की विधि का उपयोग किया। अभी भी आपकी मदद के लिए धन्यवाद, मैंने इसे +1 किया;) – Kalzem

0

यह मेरे लिए हुआ कि इस विशेष समस्या का एक और समाधान है जो संदर्भ द्वारा सरणी को संशोधित करने के मुद्दे से बचाता है।

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

इस गुमनाम कार्य करता है जो केवल उपलब्ध पीएचपी 5.3 के बाद से तो, अगर आप कुछ है पुराने, आप इसे दूसरे तरीके से लागू करने के लिए होगा और यह मुसीबत के लायक नहीं हो सकता है लेकिन मुझे लगता है कि यह एक बहुत अच्छा तरीका है कर रहे हैं का उपयोग करता है जाना।

इसके अलावा, यह और अधिक कुशल हो/इस तरह यह करने के लिए क्लीनर लग सकता है:

$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());