2012-10-09 61 views
8

提取數據我有一個數組這樣的:使用CakePHP的哈希類從陣列

Array(
    [Rating] => Array(
     [0] => Array(
      [id] => 4 
      [rating] => -1 
     ), 
     [1] => Array(
      [id] => 14 
      [rating] => 9.7 
     ), 
     [2] => Array(
      [id] => 26 
      [rating] => 9.55 
     ) 
    ) 
) 

我需要提取所有從這個數組中的評分> = 0,並且僅僅是數字。我正在用Set::extract('/Rating/rating[rating>-1]', $video)

這樣做很好但是我後來才知道這是棄用的,你現在應該使用Hash類。所以,我擡頭一看新的語法和寫道:

Hash::extract($video, 'Rating.{n}.rating[rating>-1]'); 

這給了我正確的結果,但它提供了一個惱人的警告:Warning (4096): Argument 1 passed to Hash::_matches() must be an array, string given, called in E:\www\lib\Cake\Utility\Hash.php on line 131 and defined [CORE\Cake\Utility\Hash.php, line 170]

的時候,不具備條件的警告不會發生在那裏([rating>-1]),但當然包括-1,我不想要。我在這裏做錯了什麼?我以某種方式濫用了這個功能嗎?我應該只使用已棄用的Set類嗎?或者我應該忽略這個警告,因爲一旦我將這個應用程序置於生產模式,它就不會顯示出來?

回答

16

這個問題很老,我相信它已經解決了,但CakePHP文檔有點不清楚哈希路徑語法的用法。所以,如果有其他人遇到這個,這是我發現的。

問題中的語法不正確。正確的語法是'Hash::extract($ratings, 'Rating.{n}[rating>-1].rating')'

根據文檔:「令牌由兩組表達式,用於遍歷數組數據,而匹配器被用於限定元件。」。

{n}[rating>-1]被認爲是一個令牌{n}是過濾數組鍵的表達式,在這種情況下,鍵必須是數字。 [rating>-1]匹配器,它過濾數組元素,在這種情況下,元素必須是包含名爲rating的鍵和大於-1的關聯值的數組。一旦你有了數組元素,那麼你可以得到rating

$ratings = array(
     'Rating' => array(
      array(
       'id' => 4, 
       'rating' => -1 
      ), 
      array(
       'id' => 14, 
       'rating' => 9.7 
      ), 
      array(
       'id' => 26, 
       'rating' => 9.55 
      ) 
     ) 
    ); 
    print_r(Hash::extract($ratings, 'Rating.{n}[rating>-1].rating')); 

結果:

Array ([0] => 9.7 [1] => 9.55)