Проблема в следующем:
Имеются модели dealer и region и связи:
В классе dealer:
'regions' => array(self::MANY_MANY, 'region', 'region2dealer(dealerId, regionId)'),
В классе region:
'parent' => array(self::BELONGS_TO, 'region', 'parentId'),
'regions' => array(self::HAS_MANY, 'region', 'parentId'),
В классе dealer создан метод:
public function topLevelRegions()
{
$toplevel=array();
$regions=$this->regions;
foreach ($regions as $region)
{
$node=array($region);
while($region->parent!==null)
{
$region=$region->parent;
}
if(!in_array($region,$toplevel))
{
$toplevel[]=$region;
}
}
return $toplevel;
}
В контроллере:
private function buildTree($toplevel,$regions)
{
$data=array();
if (count($toplevel)>0)
{
foreach($toplevel as $region)
{
$child=$this->buildTree($region->regions,$regions);
if ((in_array($region,$regions)) or (count($child)>0))
{
$node=array();
$node['text']=CHtml::checkBox($region->id).$region->name;
if ($child!==null)
{
$node['children']=$child;
}
$data[]=$node;
}
}
return $data;
}
else
return null;
}
Вызывается этот метод так:
$treedata=>$this->buildTree($dealermodel->topLevelRegions(),$dealermodel->regions);
Таким образом в массиве $treedata мы должны получить данные для CTreeView.
Но условие
if ((in_array($region,$regions)) or (count($child)>0))
отрабатывает неверно. Причем, проблема именно в функции "in_array". Если эту часть условия заменить на "true" или заведомо верное условие - всё работает нормально.
Если мне кто-нибудь сможет объяснить в чем причина - буду очень благодарен. Насколько мне известно "in_array" ищет по значению, а не по ссылке.
Данные в массиве содержатся верные.
Например, замена условия на
if ((in_array($region->id,array($regions[0]->id))) or (count($child)>0))
даёт одну правильную ветку.
Кроме того, в методе класса dealer функция тоже отрабатывает нормально.