0

これらのクラスインスタンスから派生したオブジェクトがあるとします

class A
{
...
 private b //list of object of class B
}

class B
{
...
 private c //list of object of class C
}

class C
{
...
 private id
}

さて、私のコードのどこかで、私はこの状況に陥っています

function findId(array $idList)
{
 [...]
}

$idList要素がこのオブジェクト「カスケード」に含まれている場合、(の各要素に対して)見つける必要がある場所

最初の解決策

//object initialization
foreach($a->getB() as $b)
{
 foreach($b->getC() as $c)
 {
  foreach($idList as $id)
  {
   if($id == $c->getId())
   {
    //do something an break the cycle
   }
  }
 }
}

2 番目のソリューション

//object initialization

$idSet = array();
foreach($a->getB() as $b)
{
 foreach($b->getC() as $c)
 {
  $idSet[] = $c->getId();
 }
}
$idSet = array_unique($idSet);

foreach($idList as $id)
{
 if(array_search($id,$idSet) !== false)
 {
  [...]
 }
}

どちらが良いですか?私の目標を達成するためのいくつかの代替方法はありますか?

重要

より良いデータ表現はありません。これは、これらのオブジェクトが何らかのデータベース オブジェクトであるためです (doctrine2)。

4

2 に答える 2

1

実際に2つのアプローチを組み合わせることができます...

foreach($a->getB() as $b)
{
 foreach($b->getC() as $c)
 {
    if (in_array($id, $idList)) {
     ...

そして、内部ループを持たない方法で絶対に最適化できない場合は、$idList の値をキーとして設定し、値を として設定し、代わりにtrueを使用します。isset()in_array()

于 2013-01-04T09:07:24.850 に答える
0

どちらも悪いと言えますが、最悪の場合、ループごとに3つの原因であるO(n ^ 3)が得られます。これらすべてのループを回避するために、データのより良い表現があるのでしょうか?

答えが「いいえ」の場合、新しいセットの作成を避けるために、最初のアプローチを使用します。

于 2013-01-04T08:57:09.877 に答える