在两个阵列中获得最佳逻辑

时间:2017-03-20 11:09:34

标签: php arrays laravel

我有数据阵列。

$data_arr = array(
       0 =>array(
           "id" => "nis-0",
           "name" =>"nam1-0",
           "age"=>11
       ),
       1 =>array(
           "id" => "nis-1",
           "name" =>"nama-1",
           "age"=>15
       ),
       2 =>array(
           "id" => "nis-2",
           "name" =>"nama-2",
           "age"=>10
       ),
       3 =>array(
           "id" => "nis-3",
           "name" =>"nama-3",
           "usia"=>13
       ),
       4 =>array(
           "id" => "nis-4",
           "name" =>"nama-4",
           "age"=>14
       )
   );

$filter_data = ['nis-1','nis-2'];

我需要在$ filter数据中获得平均年龄。 在这种情况下应该得到结果平均值:(15 + 10 )/2 = 12.5

哦是的然后我在数据$ data_arr中有100万个数据,在$ filter_data中有100个数据。 并且脚本必须走不到2分钟。 我需要最好的逻辑来执行

4 个答案:

答案 0 :(得分:2)

简单如下:

$keys = array_column($data_arr, 'age', 'id');
array_walk($keys, function($v, $k) use(&$list, $filter_data) {
    if (in_array($k, $filter_data))
    $list[] = $v;
});

print_r(array_sum($list) / count($list));
// Output : 12.5

实时视图:https://3v4l.org/ldhqA

更新

感谢Casimir et Hippolyte

您只需按键过滤它,如下所示:

$keys = array_column($data_arr, 'age', 'id');
$list = array_intersect_key($keys, array_flip($filter_data));

print_r(array_sum($list) / count($list));

答案 1 :(得分:1)

这是一个简单的代码片段,它仅根据数据数组和filter_data数组中的元素计算平均年龄

$vals=array();
foreach($data_arr as $arr){
  if(in_array(arr['id'],$filter_data){
     //store the ages with ids matching filter array
     array_push($vals,arr['age']);
  }
}
//total elements
$count=sizeof($vals);
//sum of elements
$sum=array_sum($vals);
echo "Avg ages = ".$sum/$count;

答案 2 :(得分:1)

// reduce result set to valid items as in $filter_data and having 'age' index
$validItems = array_filter(
  $data_arr,
  function ($item) use ($filter_data) {
    return isset($item['age']) && in_array($item['id'], $filter_data);
  }
);
// extract value from 'age' index
$validAges = array_map(
  function ($item) {
    return $item['age'];
  },
  $validItems
);
// execute calculation
$averageAge = array_sum($validAges) / count($validAges);
var_dump($averageAge); // outputs 12.5 for the $filter_data of the question

但是,正如评论中已经提到的那样,最有效的方法是限制已经检索的$data_arr的结果集,这意味着只查询相关数据并在那里执行可能的计算 - 然而,最初的问题没有提到数据是从数据库中提取还是从例如解析XML。

答案 3 :(得分:0)

使用array_sum()和count()函数可以轻松完成。

$average = array_sum($filter_data)/count($filter_data);