2

キー全体にスペースを含む配列があります。これは、スペースをターゲットにできない他のプログラムでターゲットを設定する際に問題を引き起こし、キーにスペースを含めることはお勧めできません。

キースペースを削除して、多次元配列のアンダースコアに置き換えるものを探しています。ほとんどの場合、再帰関数である必要がありますか?

別の質問で似たようなものを見つけましたが、値を置き換えることについてでした。

foreach ($all_regions as $key => $value){
 $all_regions[$key] = strtolower(str_replace(' ', '_', $value));
}

これを複製する必要がありますが、キー用です。私が直面している問題は、キー自体を参照する方法を考えられることです。これは、上記の方法のようにプッシュしようとすると、アンダースコアで別のキーが再作成されるだけだからです。

配列の一部です。これは奥が深いです。

Array
(
    [0] => Array
        (
            [Line Identifier] => PID
            [Set ID] => 1
            [User ID] => 
            [Requests] => Array
                (
                    [0] => Array
                        (
                            [Line Identifier] => OBR
                            [Set ID] => 1
                            [Placer Order Number] => 021120091525
                            [Results] => Array
                                (
                                    [0] => Array
                                        (
                                            [Line Identifier] => OBX
                                            [Set ID] => 1
                                    [1] => Array
                                        (
                                            [Line Identifier] => OBX
                                            [Set ID] => 2

以下で試してみましたが、Key element cannot be a reference

private function fixArrayKeys($array){
    if(is_array($array)){
        foreach($array as &$key => $value){
            if(!is_array($key))
                $array[strtolower(str_replace(' ', '_', $key))] = $value;
            else
                fixArrayKeys($array);
        }
    } else {
        return $array;
    }
}
4

3 に答える 3

7
function fixArrayKey(&$arr)
{
    $arr=array_combine(array_map(function($str){return str_replace(" ","_",$str);},array_keys($arr)),array_values($arr));
    foreach($arr as $key=>$val)
    {
        if(is_array($val)) fixArrayKey($arr[$key]);
    }
}

以下のようにテスト:

$data=array("key 1"=>"abc","key 2"=>array("sub 1"=>"abc","sub 2"=>"def"),"key 3"=>"ghi");
print_r($data);
fixArrayKey($data);
print_r($data);

これは以下を出力します:

Array
(
    [key 1] => abc
    [key 2] => Array
        (
            [sub 1] => abc
            [sub 2] => def
        )

    [key 3] => ghi
)
Array
(
    [key_1] => abc
    [key_2] => Array
        (
            [sub_1] => abc
            [sub_2] => def
        )

    [key_3] => ghi
)
于 2012-11-15T10:59:09.987 に答える
1

そもそもキーからスペースを削除しないのはなぜですか

foreach ($all_regions as $key => $value){
      $key = strtolower(str_replace(' ', '_', $key));
      $all_regions[$key] = strtolower(str_replace(' ', '_', $value));
}
于 2012-11-15T05:20:20.663 に答える
0

以下を試してください。テストはしていませんが、主な違いを確認してください

function fixArrayKeys(&$array)
{
    if(is_array($array)){
        foreach($array as &$key => $value){
            if(!is_array($value))
                $array[strtolower(str_replace(' ', '_', $key))] = $value;
            else
                fixArrayKeys(&$value);
        }
    } else {
        return $array;
    }
}
于 2012-11-15T05:25:52.197 に答える