【问题标题】:Find highest value entry in sub array using JSON & PHP使用 JSON 和 PHP 在子数组中查找最高值条目
【发布时间】:2020-02-10 21:01:12
【问题描述】:

我已经玩了几个小时了,但运气不佳。

我当前的 JSON 如下所示: https://pastebin.com/TSmWFA2g

"10-10-2019 12:00AM":[ 
  { 
     "speed":33,
     "latitude":-11.2588112,
     "longitude":100.8249533
  },
  { 
     "speed":33,
     "latitude":-11.2381112,
     "longitude":100.82509
  },
  { 
     "speed":31,
     "latitude":-11.827312,
     "longitude":100.8242733
  }
],
"10-10-2019 12:01AM":[ 
  { 
     "speed":29,
     "latitude":-11.2902112,
     "longitude":100.8202849
  },
  { 
     "speed":26,
     "latitude":-11.2826432,
     "longitude":100.3760333
  }
]

我试图做的是为每个日期找到具有最高“速度”的条目并删除该日期下的其他条目(或使用单个条目创建一个新数组)。

编辑 01: 我现在已经试过了:

function my_sort($a,$b)
{
return $b['speed'] - $a['speed'];
}
usort($finalData,"my_sort");
echo json_encode($finalData);

这会按速度对数据进行排序,但 JSON 现在不包括在原始 JSON 中找到的日期。

[{"speed":33,"latitude":-11.2588112,"longitude":100.82509}, 
{"speed":33,"latitude":-11.2588112,"longitude":100.82509}, 
{"speed":31,"latitude":-11.2588112,"longitude":100.82509}, 
{"speed":31,"latitude":-11.2588112,"longitude":100.82509}, 
{"speed":33,"latitude":-11.2588112,"longitude":100.82509}, 
{"speed":32,"latitude":-11.2588112,"longitude":100.82509}, 
{"speed":24,"latitude":-11.2588112,"longitude":100.82509}, 
{"speed":16,"latitude":-11.2588112,"longitude":100.82509},]

【问题讨论】:

  • 按速度对每个数组进行排序,然后使用splice() 删除除第一个元素之外的所有元素。
  • @Barmar 我对使用 PHP 的 JSON 很陌生,你能举个例子说明我如何按速度对数组进行排序吗?
  • StackOverflow 不是免费的编码服务。你应该try to solve the problem first。请更新您的问题以在minimal reproducible example 中显示您已经尝试过的内容。如需更多信息,请参阅How to Ask,并拨打tour :)
  • 使用json_decode() 把它变成一个PHP数组。然后使用usort() 对每个数组进行排序。然后使用array_splice() 从数组中删除所有其他条目。
  • @Barmar 我会尝试一下,并在将来更新问题。我知道这不是“免费编码服务”。正如我在问题开始时所说的那样,我已经为此进行了 3 个小时。我花了一段时间才得到这样的数组,我最初没有说明。在来这里寻求帮助之前,我已经用尽了我所有的能力。

标签: php arrays json php-7


【解决方案1】:
<?php

$data = json_decode('{
   "10-10-2019 12:00AM":[
      {
         "speed":33,
         "latitude":-11.2588112,
         "longitude":100.8249533
      },
      {
         "speed":33,
         "latitude":-11.2381112,
         "longitude":100.82509
      },
      {
         "speed":31,
         "latitude":-11.827312,
         "longitude":100.8242733
      }
   ],
   "10-10-2019 12:01AM":[
      {
         "speed":29,
         "latitude":-11.2902112,
         "longitude":100.8202849
      },
      {
         "speed":26,
         "latitude":-11.2826432,
         "longitude":100.3760333
      }
   ],
   "10-10-2019 12:02AM":[
      {
         "speed":35,
         "latitude":-11.2991112,
         "longitude":100.0129199
      },
      {
         "speed":33,
         "latitude":-11.9273112,
         "longitude":100.8734016
      },
      {
         "speed":32,
         "latitude":-11.2533212,
         "longitude":100.19229
      },
      {
         "speed":30,
         "latitude":-11.2928112,
         "longitude":100.2495099
      },
      {
         "speed":24,
         "latitude":-11.2228112,
         "longitude":100.9266033
      }
   ]
}',true);

$newArray=array();
foreach ($data as $key => $value) {
    array_multisort(array_column($value, 'speed'), SORT_DESC, $value);
    $newArray[$key]=$value[0];
}

echo "<pre>";
print_r($newArray);
echo "<pre>";
?>

【讨论】:

  • 如果需要 JSON 格式的结果,请使用 json_encode($newArray);
【解决方案2】:
$max = []; //store highest speeds in new array
foreach ($json as $key => $obj) {
   $max[$key] = max(array_map(function($o) {
      return $o;
  }, $obj));
}

工作样本:http://sandbox.onlinephpfunctions.com/code/2f6e1a86775e206650bfe86f7602464c0fce17f0

【讨论】:

    【解决方案3】:

    由于您只想要每个日期的最高值,此代码只是循环每个项目并存储该日期速度最快的项目,如果有多个具有相同速度的项目,则采用第一个。这样就不必对数组进行排序,然后将它们切碎并使 1 传递数据...

    $output = [];
    $input = json_decode($data, true);
    foreach ( $input as $date => $dateSection )  {
        $max = ["speed" => 0];
        foreach ( $dateSection as $item )   {
            if ( $item["speed"] > $max["speed"] )   {
                $max = $item;
            }
        }
        $output[$date] = $max;
    }
    print_r($output);
    

    这给出了输出...

    Array
    (
        [10-10-2019 12:00AM] => Array
            (
                [speed] => 33
                [latitude] => -11.2588112
                [longitude] => 100.8249533
            )
    
        [10-10-2019 12:01AM] => Array
            (
                [speed] => 29
                [latitude] => -11.2902112
                [longitude] => 100.8202849
            )
    
        [10-10-2019 12:02AM] => Array
            (
                [speed] => 35
                [latitude] => -11.2991112
                [longitude] => 100.0129199
            )
    
    )
    

    【讨论】:

      猜你喜欢
      • 2022-12-06
      • 1970-01-01
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多