2016-03-30 23 views
-4

私は、次のしている配列:頭の体操 - PHPの配列操作

 

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" 
} 

私は、最初の2つの数字のx.x.のユニークなペアのために最高の3番目の番号を見つける必要がありますこの例では、期待される結果は3.0.3,2.9.5,2.8.11でなければなりません。

+2

私は本当に脳ティーザーが好きですが。あなたは何かを試してみることを期待します。何か試しましたか? – izk

+0

この機能は役立ちます:http://php.net/manual/en/function.explode.php – Reversal

+0

はい私はそれを把握しようとしています。私は最初の2つの値を最初に取得しようとしていましたが、それを比較しましたが、できません。 foreach($ array = $ $)$ {0}; $ test = substr($ value、0、3); $ a = strtr($ value、array( '。' => ''、 '、' => '')); $ b =(int)$ a; $ c = substr($ b、0、2); $ new_array = array($ c); $結果=配列_ユニーク($ new_array); print_object($ result); } – user2450639

答えて

1

まず、メジャーバージョンでバージョンをグループ化する必要があります。その後あなただけの降順にversion_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>'; 

結果は次のようになります。

あなたが使用することができます
array(3) { 
    [0]=> 
    string(5) "3.0.3" 
    [1]=> 
    string(5) "2.9.5" 
    [2]=> 
    string(6) "2.8.11" 
} 
+0

これは実際にはかなり良いです!よくやった!!! – user2450639

0

のみexplode()とメジャーとマイナーバージョンとの連想配列を構築し、その後、各主要varsionのための最後の値を比較します

<?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 
)