配列と同様に、コレクションから複数の要素を削除するときは、最後の要素から順番に削除します。
削除するインデックスをコレクションにまとめて、最後の番号から並ぶようにソートすることで、短い構文で削除のコードを書くことができます。
例えば、オブジェクトのコレクションがあるとき、特定の条件の要素を削除するには、次のようなコードになります。
//コレクション変数$listから条件式に合致する要素を削除
$indexes:=$list.indices("条件式").orderBy(ck descending) //削除するインデックスのコレクションを生成
For each ($i; $indexes) //インデックスのコレクションでループする
$list.remove($i) //目的のコレクションから1要素を削除する
End for each
実際に試してみますと…
//目的のコレクションを生成
$list:=New collection
$list.push(New object("fullname"; "山田一郎"))
$list.push(New object("fullname"; "山田太郎"))
$list.push(New object("fullname"; "鈴木太郎"))
$list.push(New object("fullname"; "村山田一"))
//条件と合致するコレクションを削除
For each ($i; $list.indices("fullname = '山田@'").orderBy(ck descending))
$list.remove($i)
End for each
上記の例題では、インデックス作成の式をFor each文に直接組み込んだので、3行のコードで実装しています。
複数の条件も1つの式で書けるのであれば、同様に3行のコードで実装可能です。
//目的のコレクションを生成
$list:=New collection
$list.push(New object("fullname"; "山田一郎"; "age"; 25))
$list.push(New object("fullname"; "山田太郎"; "age"; 22))
$list.push(New object("fullname"; "鈴木太郎"; "age"; 18))
$list.push(New object("fullname"; "村山田一"; "age"; 20))
//条件と合致するコレクションを削除
For each ($i; $list.indices("fullname = '山田@' or age < 20").orderBy(ck descending))
$list.remove($i)
End for each