data =($data_in==null) ? (object)array() : json_decode(json_encode($data_in)); } /* * Делаем запрос к found */ function find($query){ $result=new AnimeAchievements(); if ($this->length()==0){ // Если текущий список пустой, то даже разбирать не надо return $result; } // @todo not in через много пробелов if (!preg_match('_^ *(type|id|status|score) *(\\<\\>|\\=|in|not in|\\>|\\<|\\>\\=|\\<\\=) *([0-9a-z, ]+)_i', $query, $a)){ return null; } // Заполняем переменные $q_variable =strtolower($a[1]); $q_comparision=strtolower($a[2]); if ($q_comparision=='not in'){$q_comparision='<>';} if ($q_comparision=='in'){$q_comparision='=';} $q_values=$a[3]; //echo '
variable '.$q_variable.'; comparision '.$q_comparision.'; q_values '.$q_values; // Находим текущий value switch ($q_variable){ case 'id': $key='anime_id'; break; default: $key=$q_variable; } //echo '
key = '.$key; // Запоняем result foreach($this->data as $datum){ $current_value=$datum->{$key}; $a =preg_split('_[ ,]_', $q_values); $u =false; foreach ($a as $value){ $value=$this->const_to_value($value); //echo '
'.$current_value.' '.$q_comparision.' '.$value; if ( (($q_comparision=='=') and($value==$current_value)) or (($q_comparision=='<>')and($value!=$current_value)) or (($q_comparision=='>') and($value< $current_value)) or (($q_comparision=='<') and($value> $current_value)) or (($q_comparision=='>=')and($value<=$current_value)) or (($q_comparision=='<=')and($value>=$current_value)) ){ $u=true; break; } } if ($u){ $result->data->{$datum->anime_id}=(object)$datum; } } return $result; } function const_to_value($value){ if (preg_match('|^([0-9]+)$|', $value, $a)){ return (int)$a[1]; } $value=strtolower($value); // 1 — TV; 2 — OVA; 3 — Movie; 4 — Special; 5 — ONA; 6 — Music switch($value){ case 'tv': return 1; case 'ova': return 2; case 'movie': return 3; case 'special': return 4; case 'ona': return 5; case 'music': return 6; case 'watching': return 1; case 'completed':return 2; case 'onhold': return 3; case 'dropped': return 4; case 'ptw': return 6; case 'drop': return 4; case 'plan': return 6; case 'complete': return 2; default: return null; } } function length(){ $count=0; foreach ($this->data as $datum){$count++;} return $count; } function average_score(){ if ($this->length()==0){return 0;} $sum=0; $count=0; foreach ($this->data as $datum){ if ($datum->score>0){$sum+=$datum->score;$count++;} } return ($count==0) ? 0 : $sum/$count; } }// class AnimeAchievements ?>