假设有一些从这些类实例派生的对象
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)
答案 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),因为每个循环都有三个。是否可能有更好的数据表示,以避免所有这些循环?
如果答案是否定的,我会采用第一种方法,以避免创建新的集合。