2012-09-29 29 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」 所以它的不到風度工作...

編輯

我做這樣的:

$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()方法必須在每次迭代中返回一個有效的Id。

+0

但我做了var_dump($ this - > _ rootObject),它重新調用了一個arrayCollection對象(鍵入我的Class)... – Nll

+0

GetId()和集合的id,是否與請求的id匹配? – JvdBerg

+0

是啊,當然,但我有一些非常奇怪的,當我把裏面的foreach var_demp(),所以我沒有任何反應?所以它拒絕運行裏面的foreach的foreach或排除什麼? – Nll

0

試想一下,沒有一個陣列中的所有對象都有你要找的ID。你的功能只會返回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)); 
    } 
    

或最後:

  • 提供了一個額外的函數首先檢查現有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); 
} 

這個集合類只提供附加的對象,而不是將其刪除,但可以在需要時可以擴展。如果您想重用現有功能,也可以從現有的類如ArrayObjectSplObjectStorage擴展。如果你的foreach循環初始化器是什麼結果後添加此行

+0

在第一條消息中編輯 – Nll

+0

我想說你的問題更多的是你需要關注孩子。 var_dump中缺少根元素的類型,這會很有幫助(它剛剛開始)。 – hakre

+0

我不明白你的意思 – Nll