哪种方法“更好”(在优化和复杂性方面)

时间:2013-01-04 08:54:41

标签: php

假设有一些从这些类实例派生的对象

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的每个元素)如果元素包含在此对象中“cascade”

第一个解决方案

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

2 个答案:

答案 0 :(得分:1)

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

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

如果您绝对无法以某种方式进行优化而没有内循环,请将$ idList的值设置为键,将值设置为true,并使用isset()代替{ {1}},因为它是最快的

答案 1 :(得分:0)

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

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