Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何筛选在每个次要版本中保持最高修补程序版本的阵列?_Php_Arrays_Semantic Versioning - Fatal编程技术网

Php 如何筛选在每个次要版本中保持最高修补程序版本的阵列?

Php 如何筛选在每个次要版本中保持最高修补程序版本的阵列?,php,arrays,semantic-versioning,Php,Arrays,Semantic Versioning,我有以下数组: array(174) { [0]=> string(5) "3.0.3" [1]=> string(5) "3.0.2" [2]=> string(5) "3.0.1" [3]=> string(5) "3.0.0" [9]=> string(5) "2.9.5" [10]=> string(5) "2.9.4" [11]=> string(5) "2.9.3" [12]=> string(5) "2.9.2"

我有以下数组:

array(174) { [0]=> string(5) "3.0.3" [1]=> string(5) "3.0.2" [2]=> string(5) "3.0.1" [3]=> string(5) "3.0.0" [9]=> string(5) "2.9.5" [10]=> string(5) "2.9.4" [11]=> string(5) "2.9.3" [12]=> string(5) "2.9.2" [13]=> string(5) "2.9.1" [14]=> string(5) "2.9.0" [18]=> string(6) "2.8.11" [19]=> string(6) "2.8.10" [20]=> string(5) "2.8.9" }
首先,必须按主版本对版本进行分组。之后,您只需使用
version\u compare
函数按降序对结果组进行排序,并返回每个组的第一个元素:

$versions = array("3.0.3", "3.0.2", "3.0.1", "3.0.0", "2.9.5", "2.9.4",
    "2.9.3", "2.9.2", "2.9.1", "2.9.0", "2.8.11", "2.8.10", "2.8.9"
);

$groupedVersions = array();
foreach ($versions as $version) {
    preg_match('/^\d+\.\d+/', $version, $majorVersion);
    if (!isset($groupedVersions[$majorVersion[0]])) {
        $groupedVersions[$majorVersion[0]] = array($version);
    } else {
        $groupedVersions[$majorVersion[0]][] = $version;
    }
}

$groupedVersions = array_map(function ($versions) {
    usort($versions, 'version_compare');
    return array_reverse($versions);
}, $groupedVersions);

$latestVersions = array_reduce($groupedVersions, function ($carry, $versions) {
    $carry[] = $versions[0];
    return $carry;
}, array());

echo '<pre>';
var_dump($latestVersions);
echo '</pre>';

您只能使用
explode()
并比较每个主变量的最后一个值,然后使用主版本和次版本构建关联数组:

Array
(
    [0] => 3.0.3
    [1] => 2.9.5
    [2] => 2.8.11
)

在PHP中对数组数据进行分组时,通常最有效的方法是根据分组条件生成临时键

我将使用一些基于以下公认答案的版本术语:

在这种情况下,将使用前两个整数(主版本和次版本)(它们必须用分隔符分隔,以避免数据冲突)。迭代时,检查输出集合中是否存在临时键。如果不存在,则添加临时键。如果存在,则检查第三个整数(维护版本)是否大于该主要次要版本组存储的维护版本——如果存在,则替换存储的主要次要版本组的值

这在我下面的代码片段中非常简洁地执行。如果需要对输出进行索引,请调用
array\u values()
,否则省略该步骤

代码:()

输出:

$versions = [
    "3.0.1", "3.0.3", "3.0.2", "3.0.0",
    "2.9.4", "2.9.3", "2.9.2", "2.9.5", "2.9.1", "2.9.0",
    "2.8.1", "2.8.11", "2.8.10"
];
    
foreach ($versions as $version) {
    $ints = explode('.', $version, 3);
    $tempKey = "{$ints[0]}.{$ints[1]}";
    if (!isset($result[$tempKey]) || version_compare($version, $result[$tempKey], 'gt')) { 
        $result[$tempKey] = $version;
    }
}
    
var_export(array_values($result));

使用
version\u compare()
是比较版本的合适工具,但是,如果您希望对维护版本值进行简单的整数对整数比较,则可以避免这种情况。这将花费更多的内存,因为您还需要存储一个分组维护版本整数数组来进行比较。我建议只比较完整版本字符串。

尽管我真的很喜欢脑筋急转弯。我们希望您已经尝试过了,您尝试过什么吗?此函数可能会有所帮助:是的,我正在尝试解决它。我试图先得到前两个值,然后比较,但我做不到。foreach($key=>$value){$test=substr($value,0,3);$a=strtr($value,array('.=>'','=>'');$b=(int)$a;$c=substr($b,0,2);$new_array=array($c);$result=array_unique($new_array);print_object($result);}使用PHP作为起点;然后,可能需要一个团队来划分主要/次要群体
    <?php
        $arr = array(0 => "3.0.3", 1 => "3.0.2", 2 => "3.0.1", 3 => "3.0.0", 9 => "2.9.5", 10 => "2.9.4", 11 => "2.9.3", 12 => "2.9.2", 13 => "2.9.1", 14 => "2.9.0", 18 => "2.8.11", 19 => "2.8.10", 20 => "2.8.9");
        $versions = array();
        $final = array();
        foreach ($arr as $version) {
            $explode = explode('.', $version); // split all parts
            $end = '';
            $begin = '';
            if (count($explode) > 0) {
                $end = array_pop($explode); // removes the last element, and returns it

                if (count($explode) > 0) {
                    $begin = implode('.', $explode); // glue the remaining pieces back together
                }
            }
            if(!empty($versions[$begin])){
                if($versions[$begin] < $end){
                    $versions[$begin] = $end;
                }
            }else{
                $versions[$begin] = $end;
            }
        }
        foreach($versions as $key=>$value){
            $final[] = "$key.$value";
        }
        print_r($final);
    ?>
Array
(
    [0] => 3.0.3
    [1] => 2.9.5
    [2] => 2.8.11
)
$versions = [
    "3.0.1", "3.0.3", "3.0.2", "3.0.0",
    "2.9.4", "2.9.3", "2.9.2", "2.9.5", "2.9.1", "2.9.0",
    "2.8.1", "2.8.11", "2.8.10"
];
    
foreach ($versions as $version) {
    $ints = explode('.', $version, 3);
    $tempKey = "{$ints[0]}.{$ints[1]}";
    if (!isset($result[$tempKey]) || version_compare($version, $result[$tempKey], 'gt')) { 
        $result[$tempKey] = $version;
    }
}
    
var_export(array_values($result));
array (
  0 => '3.0.3',
  1 => '2.9.5',
  2 => '2.8.11',
)