2012-10-09 27 views
8

Tôi có một mảng như thế này:Sử dụng lớp Hash CakePHP để trích xuất dữ liệu từ một mảng

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

tôi cần phải trích xuất tất cả các đánh giá> = 0 từ mảng này, và chỉ là con số. Tôi đã làm điều này tốt với Set::extract('/Rating/rating[rating>-1]', $video)

Nhưng sau đó tôi đã học được rằng điều này không được chấp nhận và bạn có nghĩa vụ phải sử dụng lớp Hash ngay bây giờ. Vì vậy, tôi nhìn lên cú pháp mới và viết:

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

mà mang lại cho tôi kết quả chính xác, nhưng nó mang lại một cảnh báo gây phiền nhiễu: 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]

Cảnh báo không xảy ra khi tôi không có điều kiện trong đó (số [rating>-1]) nhưng tất nhiên bao gồm -1, mà tôi không muốn. Tôi làm gì sai ở đây? Tôi có sử dụng sai chức năng này không? Tôi có nên sử dụng lớp Set không được chấp nhận không? Hoặc tôi nên bỏ qua cảnh báo vì nó sẽ không hiển thị khi tôi đưa ứng dụng này vào chế độ sản xuất?

Trả lời

16

Câu hỏi này đã cũ và tôi chắc chắn câu hỏi đã được giải quyết, nhưng tài liệu CakePHP không rõ ràng về việc sử dụng cú pháp đường dẫn Hash. Vì vậy, trong trường hợp người khác đã gặp phải điều này, đây là những gì tôi đã tìm thấy.

Cú pháp trong câu hỏi không chính xác. Cú pháp chính xác là 'Hash::extract($ratings, 'Rating.{n}[rating>-1].rating')'.

Theo tài liệu: "Tokens được tạo thành từ hai nhóm Expressions, được sử dụng để đi qua các dữ liệu mảng, trong khi quẹt được sử dụng để hội đủ điều kiện các yếu tố..".

{n}[rating>-1] được coi là một mã thông báo. {n} là biểu thức để lọc các khóa mảng, trong trường hợp này, khóa phải là số. [rating>-1]đối sánh lọc các phần tử mảng, trong trường hợp này phần tử phải là một mảng chứa khóa có tên rating và giá trị được liên kết lớn hơn -1. Khi bạn có phần tử mảng thì bạn có thể lấy số 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')); 

Kết quả trong:

Array ([0] => 9.7 [1] => 9.55) 
Các vấn đề liên quan