2012-09-29 3 views
0

У меня проблема с получением объекта из массива-коллекции объектов по ID.Получить объект из arraycollection

Ниже мой код:

protected $_rootLocation; 

public function __construct(Location $rootLocation) 
{ 
    $this->_rootLocation= $rootLocation; 

    var_dump($this->_rootLocation); 
} 

public function getLocationById($id) 
{ 
    $value = null; 
    foreach($this->_rootLocationas $root) 
     { 
      if ($id == $root->getId()) 
      { 
       $value = $root; 
       break; 
      } 
     } 

    return $value; 
} 

Тогда функция возвращает значение "NULL", так что это dosn't работа ...

Редактировать

мне нравится, что:

$manager = new LocationManager($rootLocation); 

    echo "<pre>"; 
    var_dump($manager->getLocationById('291')); 
    echo "</pre>"; 
+0

если добавить эту строку после цикла Еогеасп Инициализатора, что является результатом? echo $ id. ':'. $ Корне-> GetId(); – Gavin

+0

ничего не получается! – Nll

+0

Из чего следует, что цикл не итерации? что означает, что ему нечего переплетать, требуемых интерфейсов не поддерживается. Если у вас нет пользовательской буферизации. Трудно узнать больше, не имея возможности увидеть, как формируется myClasse. Это приводит нас к ответу @JvdBerg. Вы пытались включить отчет об ошибках: error_reporting (E_ALL); ini_set ('display_errors', '1'); – Gavin

ответ

1

Ваша функция возвращает значение null, поскольку объект не найден!

Это зависит от реализации объекта myClasse, это должно реализовать интерфейс iterator, а метод getId() должен возвращать действительный идентификатор на каждой итерации.

+0

, но я делаю var_dump ($ this -> _ rootObject), и он перенастраивает меня arrayCollection объектов (введите my Class) ... – Nll

+0

И GetId() и идентификатор коллекции, есть ли совпадение с запрошенным id? – JvdBerg

+0

да, конечно, но у меня что-то очень странное, когда я вставляю var_demp() внутри foreach, поэтому у меня нет реакции, поэтому он отказывается запускать то, что внутри foreach или foreach исключено? – Nll

0

Представьте, что ни один из объектов в массиве не имеет идентификатор, который вы ищете. Ваша функция просто вернет null. Например, с пустым массивом.

Как вы можете видеть, возвращение null не означает, что функция не работает. Он отлично работает и сделал то, что вы указали, просто, что такой объект не существует.

Это зависит от вас, чтобы решить, что делать, если это произойдет. Как вы не сказали, в вашем вопросе, существует не так много, чтобы добавить, но предложить вам несколько вариантов:

  • Вы можете проверить, если функция возвращает null, а затем принять его как «не найден» дела.

    $result = $collection->getObjectById($id); 
    if (null === $result) { 
        # object not found 
    } else { 
        # object found 
    } 
    
  • Вы можете выбросить исключение внутри функции, если функция должна вызываться только для существующих объектов:

    public function getObjectById($id) { 
    
        foreach ($this->_rootObject as $root) { 
         if ($id == $root->getId()) { 
          return $root; 
         } 
        } 
    
        throw new InvalidArgumentException(sprintf('Not a valid ID: %d', $id)); 
    } 
    

или, наконец:

  • предлагают дополнительную для проверки существующего идентификатора:

    private function findById($id) { 
    
        foreach ($this->_rootObject as $object) { 
         if ($id == $object->getId()) { 
          return $object; 
         } 
        } 
        return null; 
    } 
    
    public function hasObjectById($id) { 
    
        return null !== $this->findById($id); 
    } 
    
    public function getObjectById($id) { 
    
        if (null !== $root = $this->findById($id)) { 
         return $root; 
        } 
    
        throw new InvalidArgumentException(sprintf('Not a valid ID: %d', $id)); 
    } 
    

Кроме того, вы можете быть заинтересованы, чтобы создать себе класс с именем, который инкапсулирует ваши потребности, так что вам не нужно осуществить, что в вашем «я управляю объектом коллекции корня» объект, который больше, чем косвенные. Тогда это в основном ваш собственный класс коллекции. Пример:

interface Identifiable { 
    public function getId(); 
} 

/** 
* Example Object Class 
*/ 
class MyObject implements Identifiable { 
    private $id; 

    public function __construct($id) { 
     $this->id = (int) $id; 
    } 

    public function getId() { 
     return $this->id; 
    } 
} 

/** 
* Example Collection 
*/ 
class IdentifiableCollection implements Countable, IteratorAggregate 
{ 
    private $objects; 

    public function attach(Identifiable $object) { 
     $id = $object->getId(); 
     $this->objects[$id] = $object; 
    } 

    public function count() { 
     return count($this->objects); 
    } 

    public function has($id) { 
     return isset($this->objects[$id]); 
    } 

    public function getById($id) { 
     if ($this->has($id)) { 
      return $this->objects[$id]; 
     } 
     throw new InvalidArgumentException(sprintf("No object is identifiable for %d", $id)); 
    } 

    public function getIterator() { 
     return new ArrayIterator($this->objects); 
    } 
} 

// create the collection 
$collection = new IdentifiableCollection(); 

// fill the collection with some objects (ID 1 - 20) 
foreach(range(1, 20) as $id) { 
    $collection->attach(new MyObject($id)); 
} 

// test if an id exists and return object 
$id = 2; 
var_dump($collection->has($id), $collection->getById($id)); 

// iterate over the collection 
foreach ($collection as $object) { 
    var_dump($object); 
} 

Этот класс коллекции предлагает только прикреплять объекты, а не удалять их, но при необходимости их можно расширить. Также можно расширить существующий класс, например, ArrayObject или SplObjectStorage, если вы хотите повторно использовать существующие функции.Пример приведен в другой ответ в несколько смежный вопрос:

+0

edit в первом сообщении – Nll

+0

Я бы сказал, что ваша проблема - это больше того, что вам нужно также изучить в детях. Тип вашего корневого элемента отсутствует в var_dump, что было бы полезно (это в самом начале). – hakre

+0

Я не понимаю, что вы имеете в виду – Nll

Смежные вопросы