【问题标题】:Parsing a JSON file and comparing semvers解析 JSON 文件并比较 semvers
【发布时间】:2016-02-14 13:11:10
【问题描述】:

我有一个大概像这样的 json 文件。

{
   "foo" : {
      "name" : "bar", 
      "dev-master" : {}, 
      "3.0-dev" : {}, 
      "2.4" : {}, 
      "master" : {},
   }
}

我想知道是否有解决方案来解析并获取最重新发送的 semver 标签。我试过了:

<?php 
$file = 'data.json'; 
$content = file_get_contents($file); 
$content = json_decode($content); 

$container = [];
foreach($content as $version){
  $container[$version] = $version; 
}

.. 

现在,假设 $container 包含所有标签,我如何获得最新版本将是 2.4。

获取2.4 不是问题,而是通过一种面向未来的可靠方法来找出最新的。

【问题讨论】:

  • 会一直在master之前吗?还是接近尾声?
  • PHP 有一个 version_compare 函数。但是那种依赖于版本是它理解的格式哈哈
  • @Darren 我不知道。这才是真正的问题。我猜这个问题更多的是关于语义版本控制而不是 php/json
  • 嗯...这个项目真的使用了semver.org 之类的东西吗?还是另一套规则?在不了解他们的情况下,我们很难提供帮助。
  • 您可以在排序函数中使用它(例如 usort),然后获取第一个结果

标签: php json semantic-versioning


【解决方案1】:

这是一种方法。它假设最新版本号仅由数字和小数点组成。您可以更新正则表达式以允许破折号等。

#!/usr/bin/php
<?php
$content = json_decode(file_get_contents('data.json'));
$container = [];
foreach($content as $name => $versions){
        $props   = get_object_vars($versions);
        $container[$name] = null;
        foreach (array_keys($props) as $versionName) {
                if (preg_match('/^[0-9\.]+$/',$versionName)) {
                        // Ensure if multiple versions are present the greatest 
value will be used
                        if (isset($container[$name])) {
                            $container[$name] = max($versionName,$container[$nam
e]);
                        } else {
                            $container[$name] = $versionName;
                        }
                }
        }
}
var_dump($container);

如果没有找到最终版本,版本名称将为空。

【讨论】:

  • “它使用假设......” 这就是我想要避免的。如果它是基于假设,它永远不会是正确的。
  • 您需要以某种方式定义“最新版本”是什么。有可以使用的日期/时间戳吗?
  • 是的,实际上有一个时间戳。它只是嵌套了几个层次,所以很难获取和比较所有
  • max 应确保这适用于语义版本控制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-17
  • 1970-01-01
  • 2013-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多