yamashiro0110の日記

yamashiro0110の日記です。おもにIT技術のメモを綴っていきます(^o^)

配列のめも


助けてと頼まれたので、書きますφ(..)メモメモ

助けて先輩!俺のPHPの配列の組み直しは最適なのか確認したい - ITの隊長のブログ


環境

$ node -v
v0.10.25

コード

JavaScriptで書いてますが、言語特有の関数とか使ってないし PHPでも似たようなことは出来る(はず)という前提です(-_-;)


流れとしては、未登録の場合は新規追加、 そうでなければ登録済のものを取り出して値を追加としてます。

基本的には、そんな変わらない・・・

変更した点は、エンティティクラスを利用するようにした点ですかね。

table_03というカラムが、idに重複がある場合は配列になるようだったので、 最初からデータを配列で持つようにしました。

genreListという変数のこと。 文字列と配列が混合してしまうようなら、配列で統一したほうが扱いやすいかと思います


補足

あと、元のコードで気になった点が一つ

// 初回のみ$result_arrayは連想配列ではないため、比較するとエラーになる

// なので、配列が空であれば0なので、条件分岐でfalse(初回追加となる)

ループの回数に依存すると、バグの原因になりそうだったので↓のように修正してみました(間違ってたらサーセン

以下の部分

// for文から外に出すためにここで実行

// 整列した配列を格納したい変数です
$result_array = array();

// ****************************
// for文から外に出すためにここで実行

// 初回の追加
$empty_array = array();

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

array_push($result_array, $empty_array);
// ****************************

// $sql_dataには先程のsql結果のデータが入っています。
foreach($sql_data as $k => $v) {

    $tmp_array_save = array();
    array_walk_recursive($v, function(&$value, $key) use (&$tmp_array_save) {
        $tmp_array_save[$key] = $value;
    });

    // 返す配列にすでに存在しているかチェック
    $contents_id_array = Hash::extract($result_array, '{n}.contents_id');

    if (in_array($tmp_array_save['contents_id'], $contents_id_array)) {

        // 存在している場合は重複なので、追加
        // contents_idから逆引きして格納が必要な配列番号を探す
        $iterator = new RecursiveIteratorIterator(
            new RecursiveArrayIterator($result_array),
            RecursiveIteratorIterator::SELF_FIRST
        );

        // table03が追加される配列番号を格納する変数
        $add_index_number = '';
        foreach ($iterator as $iterate_key => $iterate_leaf) {
            if (is_array($iterate_leaf)) {
                $add_index_number = $iterate_key;
            }
        }

        // table03の値が重複していないかチェック、していなければ追加
        if (! in_array($tmp_array_save['table_03'], $result_array[$add_index_number])) {
            $tmp_tags_data = $result_array[$add_index_number]['table_03'];
            $result_array[$add_index_number]['table_03'] = array();
            array_push($result_array[$add_index_number]['table_03'],
            $tmp_array_save['table_03'],
            $tmp_tags_data);
        }
    }
    else {
        // 存在していない場合は新規追加
        array_push($result_array, $tmp_array_save);
    }
}

// 確認コード
dump($result_array);