Php 数组\u walk\u recursive-修改键和值

Php 数组\u walk\u recursive-修改键和值,php,Php,如何使用array\u walk\u recursive修改键和值 这里只对值进行编码 function _utf8_encode($arr){ array_walk_recursive($arr, 'utf8_enc'); return $arr; } function utf8_enc(&$value, &$key){ $value = utf8_encode($value); $key = utf8_encode($key); } ar

如何使用
array\u walk\u recursive
修改键和值

这里只对值进行编码

function _utf8_encode($arr){
    array_walk_recursive($arr, 'utf8_enc');

    return $arr;
}

function utf8_enc(&$value, &$key){
    $value = utf8_encode($value);
    $key = utf8_encode($key);
}

array\u walk\u recursive
只对数组的值应用user函数,而不对索引应用user函数(我认为这与数组的索引必须是唯一的这一事实有关,因此您无法对它们进行操作)。最好是自己编写一个递归函数。以下方面应起作用:

function utf8enc($array) {
    if (!is_array($array)) return;
    $helper = array();
    foreach ($array as $key => $value) $helper[utf8_encode($key)] = is_array($value) ? utf8enc($value) : utf8_encode($value);
    return $helper;
}

$enc_array = utf8enc($your_array);

除了rabudde的答案之外,还有另一个递归函数:

  function utf8_encode_array($array_to_encode=array()){

        $encoded_array=array();

        if(is_array($array_to_encode)){

            foreach($array_to_encode as $key => $value){

                $key=utf8_encode($key);

                if(is_array($value)){

                    $encoded_array[$key]=utf8_encode_array($value);

                }
                else{

                    $encoded_array[$key]=utf8_encode($value);

                }
            }
        }

        return $encoded_array;
    }

这是我的递归函数,它不仅可以将数组的值更改为array_walk_recursive(),还可以更改给定数组的键。它还保持数组的顺序

/**
*按照数组顺序递归地更改给定数组中的值和键。
*
*@param array$\原始数组。
*@param callable$\回调回调函数采用2个参数(键、值)
*并返回数组[newKey,newValue],如果没有更改,则返回null。
*
*@返回无效
*/
函数modifyArrayRecursive(数组和$\u数组,可调用$\u回调):void
{
$keys=\array\U keys($\U array);
foreach($keys为$keyIndex=>$key){
$value=&$_数组[$key];
if(\is_数组($value)){
modifyArrayRecursive($value,$\u回调);
继续;
}
$newKey=$key;
$newValue=$value;
$newPair=$\回调($key,$value);
如果($newPair!==null){
[$newKey,$newValue]=$newPair;
}
$keys[$keyIndex]=$newKey;
$\u数组[$key]=$newValue;
}
$\u数组=\array\u组合($键,$\u数组);
}
/**
*用法示例
*/
modifyArrayRecursive($keyboardArr,function($key,$value){
如果($value=='some value'){
返回['new_key_for_this_value',$value];
}
返回null;
});

函数不会正确修改嵌套数组键上的所有键。示例:
['key1'=>['key2'=>['key3'=>'value']]]