キー「menu_title」と「id」を持つ配列の2つの配列があります。
2つの配列を調べて、「menu_title」を2番目の配列の配列と共有する最初の配列の任意の配列のIDを3番目の配列に格納したいと思います。
私はそのようにそれを行うことができることを知っています:
$collision = [];
foreach($children as $child)
foreach($siblings as $sibling)
if($child['menu_title'] == $sibling['menu_title'])
$collision[] = $child['id'];
しかし、それは私が最初のすべてのアイテムの2番目の配列をループしていることを意味します。
おそらくこれはより良いでしょうか?
$collision = [];
foreach($siblings as &$sibling)
$sibling = $sibling['menu_title'];
foreach($children as $child)
if(in_array($child['menu_title'], $siblings))
$collision[] = $child['id'];
しかし、私はまだもっと良い方法があるに違いないと思いますか?
アップデート
配列にはsqlが入力されます。基本的に、カテゴリを削除すると、削除するカテゴリと同じレベルに子カテゴリが移動します。
しかし、子のいずれかが削除カテゴリの兄弟の1つと同じmenu_titleを持っている場合は、子のmenu_titleの名前を「whatever-1」(例:「computers-1」)に変更する必要があります。
だから私は更新する必要のあるIDの配列を構築していて、それからそれらのIDに対してsql更新を行います。おそらくこれにアプローチする方法に拡張が行われる可能性がありますか?
アップデート
だから、結局私は次のようになりました:
$id = 4;
$category = $this->categoryeditormodel->getCategory($id);
$children = $this->categoryeditormodel->getChildCategories($id);
$siblings = $this->categoryeditormodel->getSiblingCategories($id);
foreach($siblings as &$sibling)
$sibling = $sibling['menu_title'];
foreach($children as &$child){
$child['parent_id'] = $category['parent_id'];
if(in_array($child['menu_title'], $siblings)){
$i = 0;
while(in_array(($name = ($child['menu_title'].'-'.++$i)), $siblings));
$child['menu_title'] = $name;
}
}
$this->categoryeditormodel->update_batch($children);
上部の3つの関数は、それらが言うことを実行しますが、カテゴリがすでにキャッシュにロードされているため、別のSQLクエリではないため安価です。
update_batchは、Code Igniters update_batch関数への単なるショートカットですが、テーブル名とidキーを通過します。
何かご意見は?