3

そこで、配列の2つのレベルでキーとサブキーのペアを検索する関数を作成しました。基本的には探していてkey['subkey']、見つかった場合はを返しますkey['subkey']

私が探しているのは、本当に再帰的で、配列の最後に到達してfalseを返すように強制されるか、値を見つけて返すまで、必要なだけ深いレベルを検索する方法でこれを行う方法です。

私はPHPで完全に初心者であり、何時間もグーグルで検索しても結果はありません。正しい方向へのポインタをいただければ幸いです。

これは機能です:

function searchArray($array, $key, $subkey) {
    foreach ($array as $item){
        if (is_array($item) && isset($item[$key]) && isset($item[$key][$subkey])){
            return $item[$key][$subkey];
        } else {
            foreach ($item as $subitem){
                if (is_array($subitem) && isset($subitem[$key]) && isset($subitem[$key][$subkey])){
                    return $subitem[$key][$subkey]; 
                }
            }
        }
    }
}

サンプル配列:

"locales" => array(
    "America" => array(
        "locations" => array(
            "us" => array(
                "title" => "United States",
                "lang" => "en_US",
            ),
            "gl" => array(
            )
        )
    ),
    "Europe" => array(
        "locations" => array(
            "at" => array(
                "title" => "Österreich",
                "lang" => "de_DE",
            ),
            "fr" => array(
                "title" => "France",
                "lang" => "fr_FR",
            ),
            "de" => array(
                "title" => "Deutschland",
                "lang" => "de_DE",
            ),
            "it" => array(
                "title" => "Italy",
                "lang" => "it_IT",
            ),
            "uk" => array(
                "title" => "United Kingdom",
                "lang" => "en_GB",
            )
        )   
    ),
    "Africa" => array(
        "locations" => array(
            "za" => array(
                "title" => "Südafrika",
                "lang" => "en_ZA",
            )
        )
    ),
    "Asia & Pacific" => array(
        "locations" => array(
            "au" => array(
                "title" => "Australia",
                "lang" => "en_AU",
            ),
            "cn" => array(
                "title" => "中国",
                "lang" => "zh_CN",
            ),
            "hk" => array(
                "title" => "香港",
                "lang" => "zh_CN",
            ),
            "jp" => array(
                "title" => "日本",
                "lang" => "jp_JP",
            ),
            "kr" => array(
                "title" => "한국",
                "lang" => "ko_KR",
            )
        )
    )
)

呼び出しsearchArray($siteOptions['locales'], 'us', 'lang')はを返す必要があり'en_US'ます。

4

3 に答える 3

3
function walk($array, $key, $option) {
    if( !is_array( $array)) {
        return false;
    }
    foreach ($array as $k => $v) {
        if($k == $key && is_array($v) && isset($v[$option])){
            return $v[$option];
        }
        $data = walk($v, $key, $option);
        if($data != false){
            return $data;        
        }
    }

    return false;
}

echo walk($array, 'jp', 'lang');
于 2012-11-14T23:19:52.500 に答える
2
function searchArray($arr, $key, $subkey) {
    $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr), RecursiveIteratorIterator::SELF_FIRST);
    $found = false;
    foreach($it as $k => $v) {
        if ($k == $key && !$found) $found = true;
        elseif ($k == $subkey && $found) return $v;
    }
    return false;
}
于 2012-11-14T20:39:13.910 に答える
0

使ってみてくださいarray_walk_recursive(): http://us1.php.net/function.array-walk-recursive

デフォルトでは、あなたが望むことを正確に行うわけではありません。サブキーなどをチェックするには、少しコードを書く必要があります。

于 2012-11-14T20:30:34.223 に答える