2012-10-09 16 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::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 है, जो मैं नहीं चाहता हूं। मुझसे यहां क्या गलत हो रहा है? क्या मैं इस समारोह को किसी भी तरह दुरुपयोग कर रहा हूं? क्या मुझे बस बहिष्कृत सेट क्लास का उपयोग करना चाहिए? या क्या मुझे चेतावनी को अनदेखा करना चाहिए क्योंकि यह इस ऐप को उत्पादन मोड में डालकर दिखाई नहीं देगा?

उत्तर

16

यह प्रश्न पुराना है और मुझे यकीन है कि यह पहले ही हल हो चुका है, लेकिन केशपीएचपी दस्तावेज हैश पथ वाक्यविन्यास के उपयोग के बारे में थोड़ा अस्पष्ट है। इसलिए, अगर किसी और के पास यह आ गया है, तो मुझे जो मिला वह है।

प्रश्न में वाक्यविन्यास सही नहीं है। सही वाक्यविन्यास 'Hash::extract($ratings, 'Rating.{n}[rating>-1].rating')' है।

प्रलेखन के अनुसार: "टोकन, दो समूहों से बना रहे हैं भाव, सरणी डेटा पार करने के लिए उपयोग किया जाता है, जबकि matchers तत्वों अर्हता प्राप्त करने के लिए इस्तेमाल कर रहे हैं।।"।

{n}[rating>-1] को टोकन माना जाता है। {n}अभिव्यक्ति है जो सरणी कुंजी फ़िल्टर करता है, इस मामले में कुंजी संख्यात्मक होना चाहिए। [rating>-1]matcher जो सरणी तत्वों को फ़िल्टर करता है, इस मामले में तत्व एक सरणी होना चाहिए जिसमें 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) 
संबंधित मुद्दे