配列のめも
助けてと頼まれたので、書きますφ(..)メモメモ
助けて先輩!俺の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);