技術的自由への長い道

日々学んでいきます。

#ゆめみからの挑戦状 ★第5弾での学び

問題

<?php 

$in = [ ['2nd' => 'two', 'four' => '4th'], 'three' => '3rd', ['one' => '1st'], '10th' => 'ten', ['6th' => 'six'], '5th' => 'five', 'seven' => '7th', ['fourteen' => '14th', '11th' => 'eleven'], ['8th' => 'eight'], 'thirteen' => '13th', '12th' => 'twelve', 'nine' => '9th', ['15th' => 'fifteen'], ]; 

// 以下と同じ配列を $in から作って出力してください
[ // '1st' => 'one', // '2nd' => 'two', // '3rd' => 'three', // '4th' => 'four', // '5th' => 'five', // '6th' => 'six', // '7th' => 'seven', // '8th' => 'eight', // '9th' => 'nine', // '10th' => 'ten', // '11th' => 'eleven', // '12th' => 'twelve', // '13th' => 'thirteen', // '14th' => 'fourteen', // '15th' => 'fifteen', // ]

回答

qiita.com

上記回答です。いろいろな回答があって面白かった~

学んだこと

自分の回答は下記、解けることは解けたけど学びが二点あったのでメモ。

function array_flatten($arr)
{
    $v = [];
    array_walk_recursive($arr, function ($key, $value) use (&$v) {

        //keyとvalueを逆転
        if (is_numeric($value[0])) {
            list($key, $value) = array($value, $key);
        }
        $v[$key] = $value;
    });


    return $v;
}


$out = array_flatten($in);
uksort($out, function ($a, $b) {
    $a_num = preg_replace('/[^0-9]/', '', $a);
    $b_num = preg_replace('/[^0-9]/', '', $b);

    return $a_num > $b_num;
});

① 文字列中に数字が含まれているかを(int)で判定できる is_numeric("1st"[0])みたいにやってしまっていたが、(int)("1st")で判定できる

② 1st,2nd,3rd...10th,11thみたいなときに通常ソートではうまくいかないが、SORT_REGULAR SORT_NATURALを使うとうまくいく SORT_NUMERICは(int) キャストされた状態でソートできるので、ksort($out, SORT_NUMERIC);とすれば良い