Php 通过引用修改数组

Php 通过引用修改数组,php,mysql,arrays,reference,multidimensional-array,Php,Mysql,Arrays,Reference,Multidimensional Array,我从MySQL数据库收到一个多维数组 Array ( [0] => Array ( [page] => categorypropose [value] => baby-sitters [id] => 357960 ) [1] => Array ( [page] => categorysearch [value] => adéquate pour g

我从MySQL数据库收到一个多维数组

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

[1] => Array
    (
        [page] => categorysearch
        [value] => adéquate pour garder
        [id] => 357961
    )
...
)
在这个数组中,我有一些ISO-8859-1到UTF8的转换要通过“自制”函数“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);
它不会保留更改(当我回显$value时,它会工作,但修改不会保留在最后…)

编辑:这是我不得不使用的函数loadtext(实际上,我没有制作它,但我必须使用它…)


您可以这样尝试:

$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);
$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());
但更好的是,您可以尝试在查询中使用MySQL函数
CONVERT()
,以便返回的字符串已经是UTF8格式

至少,使用PHP的
mb\u convert\u encoding()
而不是您自己编写的函数。没有理由重新发明轮子


我自己找到了一个简单的答案,这个答案对我来说非常有效,但是使用php中的另一个方法来更改我从mysql结果中获得的值

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

我突然想到,对于这个特殊的问题,还有另一种解决方案,它避免了通过引用修改数组的问题

$array = array_map(function ($row) {
    return array_map(function ($col) { return mb_convert_encoding($col, 'ISO-8859-1'); }, $row);
}, $query->result_array());
它使用的匿名函数仅在PHP5.3之后才可用,因此,如果您使用的是较旧的函数,则必须以不同的方式实现它,这可能不值得费心,但我认为这是一种非常好的方法

此外,这样做可能更高效/看起来更干净:

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

我会添加一些调试的东西-一个
print\r
和另一个在“outter”循环中。并测试您是否只需执行
$array=array(array(1,2,3),array(4,5,6))
$value=$value*2
进行测试。在我的loadtext函数中,我单独操作$value,如下所示“$text=str_replace(“:”,“:”,$text);”。顺便问一下,你的第二个代码会保留对$array的更改吗?你能运行代码并告诉我它是否有效吗?我认为secong代码应该有效,试试print\r($array);退出;奇怪的是,为了调试结果,它实际上不起作用。我最终使用了Okonomiyaki的方法。还是要谢谢你的帮助,我会的;)谢谢,我用了你的方法。我不知道MySQL有CONVERT()函数!伟大的接受答案。零票。应该有一个徽章。奇怪的是,我以为我是同时做的