in_array и массив ActiveRecord

Проблема в следующем:

Имеются модели 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 функция тоже отрабатывает нормально.

насколько понимаю вопрос, то in_array не работает с объектами (по моему). И вообще попробуйте:




<?php

class Test {

	public $id;

	

	function add() { }

}


$t1 = new Test;

$t2 = new Test;


if($t1 == $t2) echo "true";

else echo "false";


echo "<br>";


if($t1 === $t2) echo "true";

else echo "false";

?>



Я в курсе насчет "==" и "===". Но я не уверен, какой из них использует "in_array". Я бы сразу предположил, что "===", если бы код




if(!in_array($region,$toplevel))

{

    $toplevel[]=$region;

}



в методе класса dealer не отрабатывал так как ожидалось. Результирующий массив действительно не содержит одинаковых записей в случае, если использовать это условие, и содержит повторяющиеся, если условие закоментировать.

Ну и здесь я нашел следующее:

И, как я понял, именно этот вариант используется в "in_array".

У меня появилась мысль, что такая ситуация могла возникнуть из-за каких-либо свойств класса CActiveRecord, которые в моём случае, возможно, имеют разные значения по какой-либо причине. Как вы считаете?

Проверял, in_array нормально работает с объектами, скорее всего. Просто тут дело в том что сам Yii использует патер скафолдинга, и новые объекты то го же класса не создает… возможно в процессе где-то есть ссылки на объекты которые не пересоздаются и потому что то идет не так… в таких случаях я использую var_dump… и просто посмотрите чем они отличаются…

Да и в принципе если вы приводите функции попытайтесь прокомментировать их, что во от них хотели получить, а то как-то отрывками сложно въехать…

Спасибо за помощь.

Решил не копать в чем там дело и искать по id, поскольку в моем случае всё равно приходится строить массив, в котором производится поиск, вручную.

Строю массив, сожержащий не объекты, а их id, и ищу так:




if (in_array($region->id,$ids))

...