查找阵列元件具有匹配值

问题描述:

我有一个包含多个对象的阵列,其中一些对象可以具有用于lap_time匹配值,在这个例子元件1,和2具有匹配的值:查找阵列元件具有匹配值

Array 
(
    [0] => stdClass Object 
     (
      [id] => 1 
      [recorded_time] => 00:51:55.000000 
      [corrected_time] => 00:45:32.456140 
      [lap_time] => 00:09:06.491228 
      [laps] => 5 
      [code] => 
      [sail_no] => 4931 
      [class] => SOLO 
      [helm_fname] => [Removed] 
      [helm_lname] => [Removed] 
      [crew_1_fname] => 
      [crew_1_lname] => 
      [crew_2_fname] => 
      [crew_2_lname] => 
      [modified_time] => 
      [created_time] => 2017-02-19 17:53:48 
      [created_fname] => Admin 
      [created_lname] => istrator 
      [modified_fname] => 
      [modified_lname] => 
      [points] => 1 
     ) 

    [1] => stdClass Object 
     (
      [id] => 21 
      [recorded_time] => 00:50:07.000000 
      [corrected_time] => 00:45:56.186984 
      [lap_time] => 00:09:11.237397 
      [laps] => 5 
      [code] => 
      [sail_no] => 67173 
      [class] => LASER 
      [helm_fname] => [Removed] 
      [helm_lname] => [Removed] 
      [crew_1_fname] => 
      [crew_1_lname] => 
      [crew_2_fname] => 
      [crew_2_lname] => 
      [modified_time] => 2017-02-22 10:51:58 
      [created_time] => 2017-02-19 18:40:58 
      [created_fname] => Admin 
      [created_lname] => istrator 
      [modified_fname] => 
      [modified_lname] => 
      [points] => 2 
     ) 

    [2] => stdClass Object 
     (
      [id] => 2 
      [recorded_time] => 00:50:07.000000 
      [corrected_time] => 00:45:56.186984 
      [lap_time] => 00:09:11.237397 
      [laps] => 5 
      [code] => 
      [sail_no] => 52441 
      [class] => LASER 
      [helm_fname] => [Removed] 
      [helm_lname] => [Removed] 
      [crew_1_fname] => 
      [crew_1_lname] => 
      [crew_2_fname] => 
      [crew_2_lname] => 
      [modified_time] => 2017-02-22 10:51:58 
      [created_time] => 2017-02-19 18:40:58 
      [created_fname] => Admin 
      [created_lname] => istrator 
      [modified_fname] => 
      [modified_lname] => 
      [points] => 3 
     ) 

如果任何对象的匹配值为lap_time,匹配对象需要对它们的点进行平均。

这就是我开始做的,但我意识到这可能不是最好的方式去做这件事。 break_race_ties方法尚未完成。

<?php 

class Results_calculations_model 
{ 
    public 
    function race_points($results) 
    { 
     $points = 0; 
     $results_with_points = array(); 

     foreach ($results AS $result) { 
      //increment points by one for each position 
      $points++; 
      $result->points = $points; 

      //add result back to array; 
      $results_with_points[] = $result; 
     } 


     $results_with_points = $this->break_race_ties($results_with_points); 

     return $results_with_points; 
    } 

    protected 
    function break_race_ties($results) 
    { 
     $previous_time = 0; 
     $ties = array(); 

     foreach ($results AS $result) { 

      if ($previous_time === $result->lap_time) { 
       $ties['points'][] = $result->points; 
       $ties['id'][] = $result->id; 

       $average_points = $this->average_array_values($ties['points']); 
      } 


      $previous_time = $result->lap_time; 
     } 
    } 

    protected 
    function average_array_values($values) 
    { 
     $number_of_elements = count($values); 
     $total_points = array_sum($values); 

     return $total_points/$number_of_elements; 
    } 
} 

你可以建议可能会帮助我的任何功能,或做什么

这里就是我最后做

 /** 
    * Find the amount of points each boat in the race should have 
    * 
    * This method will assign points and, in the event of a tie, 
    * average them. 
    * 
    * @param $results 
    * 
    * @return array 
    */ 
    public function race_points($results) 
    { 
     $points = 0; 
     $results_with_points = array(); 

     //assign incremental amounts of points to each boat 
     foreach ($results AS $result) { 
      //increment points by one for each position 
      $points++; 
      $result->points = $points; 

      //add result back to array; 
      $results_with_points[] = $result; 
     } 

     $results_with_points = $this->break_race_ties($results_with_points); 

     return $results_with_points; 
    } 

    /** 
    * Find any ties and average their points 
    * 
    * @param $results 
    * 
    * @return mixed 
    */ 
    protected function break_race_ties($results) 
    { 
     $ties = $this->find_race_ties($results); 

     if (!empty($ties)) { 
      //looks like there are tied results, average the points and assign them 

      foreach ($ties AS $tie) { 
       $points = $this->average_array_values($tie['points']); 

       foreach ($tie['id'] AS $id) { 
        $results[ $id ]->points = $points; 
       } 
      } 
     } 

     return $results; 
    } 

    /** 
    * Determine if any ties exist and get some information about them 
    * 
    * Finds any existing ties in the array of results and gets, 
    * their element id and the points of each tying boat. 
    * 
    * @param $results 
    * 
    * @return array 
    */ 
    protected function find_race_ties($results) 
    { 
     $previous_id = NULL; 
     $previous_points = NULL; 
     $previous_time = NULL; 
     $ties = array(); 

     foreach ($results AS $id => $result) { 

      if ($previous_time === $result->lap_time) { 

       // Create empty array if required, so we don't push to NULL 
       if (!isset($ties[ $previous_time ])) { 
        $ties[ $previous_time ]['points'] = array(); 
        $ties[ $previous_time ]['id'] = array(); 
       } 

       // Add each individual value to the array containing duplicates. 
       // $previous_time is used as a key because it's identical when 
       // it needs to be, meaning points and ids are grouped. 
       array_push($ties[ $previous_time ]['points'], $result->points, $previous_points); 
       array_push($ties[ $previous_time ]['id'], $id, $previous_id); 

       // Remove duplicate values. 
       $ties[ $previous_time ]['points'] = array_unique($ties[ $previous_time ]['points']); 
       $ties[ $previous_time ]['id'] = array_unique($ties[ $previous_time ]['id']); 
      } 

      //Set these values for the next iteration to compare against 
      $previous_id = $id; 
      $previous_points = $result->points; 
      $previous_time = $result->lap_time; 
     } 

     return $ties; 
    } 

    protected function average_array_values($values) 
    { 
     $number_of_elements = count($values); 
     $total_points = array_sum($values); 

     return $total_points/$number_of_elements; 
    } 

的代码示例,试试这个..

class Results_calculations_model 
{ 
    public 
    function race_points($results) 
    { 
     $results_with_points = $this->break_race_ties($results); 

     return $results_with_points; 
    } 

    protected 
    function break_race_ties($results) 
    { 
    $previous = null; 
    foreach($results as &$current) { 
     if(!empty($previous)) { 
     $this->average_array_values($current, $previous); 
     } 
     $previous = $current; 
    } 
    } 

    protected 
    function average_array_values(&$current, &$previous) 
    { 
     if($current->lap_time == $previous->lap_time) { 
      $avg = ($current->points + $previous->points)/2; 
      $current->points = $previous->points = $avg; 
     } 
    } 
} 
+0

如果3个或更多关系出现在单个'lap_time'中,这会起作用吗? –