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
   }
  }
 }
}

第二种解决方案

//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

你实际上可以结合这两种方法......

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

我会说两者都很糟糕,在最坏的情况下,它们会给出 O(n^3),因为每个循环都是三个。为了避免所有这些循环,是否可以更好地表示数据?

如果答案是否定的,我会采用第一种方法以避免创建新集合。

于 2013-01-04T08:57:09.877 回答