2016-03-30 20 views
-4

ben şu var dizi:Zeka - php dizi manipülasyon

 

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

İlk iki sayı x.x. eşsiz çifti için en yüksek 3 sayı bulmalıyız Bu örnekle beklenen sonuç 3.0.3, 2.9.5, 2.8.11 olmalıdır.

+2

Gerçekten beyin tarayıcıları gibi. Şimdiden bir şey denediğini bekliyoruz, bir şey denediniz mi? – izk

+0

Bu işlev size yardımcı olabilir: http://php.net/manual/en/function.explode.php – Reversal

+0

Evet Bunu anlamaya çalışıyorum. İlk önce ilk iki değeri elde etmeye çalışıyordum ve sonra onu karşılaştırdım, ama bunu yapamam. foreach ($ dizisi $ anahtar => $ değer) { $ test = substr ($ değer, 0, 3); $ a = strtr ($ değer, dizi ('.' => '', ',' => '')); $ b = (int) $ a; $ c = substr ($ b, 0, 2); $ new_array = array ($ c); $ sonuç = array_unique ($ new_array); print_object ($ sonuç); } – user2450639

cevap

1

İlk önce, sürümleri büyük sürümle gruplandırmalısınız. Bundan sonra sadece azalan bir şekilde version_compare işlevini kullanarak sonuçlandı sıralamak gerekiyor ve her grubun ilk elemanını döndürmek için:

$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>'; 

sonuç şöyle olacaktır:

array(3) { 
    [0]=> 
    string(5) "3.0.3" 
    [1]=> 
    string(5) "2.9.5" 
    [2]=> 
    string(6) "2.8.11" 
} 
+0

Bu aslında oldukça iyi! İyi iş!!! – user2450639

0

kullanabilirsiniz sadece explode() ve büyük ve küçük versiyonu ile ilişkisel dizi oluşturmak için daha sonra, her bir ana varsion için son değerini karşılaştırmak:

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

Çıktı:

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