要素が1つしかない連想配列のネストを解消する

WordPress関数(特に$wpdbクラスなどに多い。get_results()メソッドでDBの値をとって来たときなど)を使っていて、戻り値の配列が一つしか要素持ってないのに連想配列になっていたりする場合、値を取り出すときにネストしたループ処理を書くケースが結構ある。 以前からコード的に冗長で非効率だよなぁ…と思っていて、今回改善方法を見出してスッキリしたので、ここにTIPSとして残しておこうかと。

$array = array(
    array(
        'key_1' => 'value_1', 
        'key_2' => 'value_2', 
    ), 
);

foreach ($array as $nested_array) {
    foreach ($nested_array as $key => $value) {
        echo 'array["' . $key . '"] => "' . $value . '"<br />';
    }
}

今まではこんな感じに(無駄ではないのだが、効率的ではない)foreachループを連想配列の入れ子分回して値取ってた…。 で、この連想配列とループのネストを解消してシンプルに処理を書けないものか…とPHPのarray関数を色々と試してみた。array_reduce()とかarray_walk()とかあんまり使わない関数で、独自にネスト解消用の関数組んでもできるんだが、別途独自関数用意しなきゃならなくてまるでスマートでない…。なんかスパっと1ラインで解決できないかと試行錯誤してみたところ、ありました! array_shift()で先頭要素取得して元の配列変数を上書きしてしまえばいいのです。

$array = array_shift($array);

たったこれだけ(笑) でも、これだけだと配列の要素数が1つ以上でも上書きしてしまうので、要素数の判定を入れておく。

$array = (count($array) == 1) ? array_shift($array) : $array;

最初のコードをこのコード使って書き直してみると、

$array = array(
    array(
        'key_1' => 'value_1', 
        'key_2' => 'value_2', 
    ), 
);

$array = (count($array) == 1) ? array_shift($array) : $array;
foreach ($array as $key => $value) {
    echo 'array["' . $key . '"] => "' . $value . '"<br />';
}

いやぁ、だいぶスッキリした。私のモヤモヤも晴れました。