2016-03-30 6 views
-4

Ich habe folgende Array:Gehirn Teaser - PHP-Array-Manipulation

 

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

Ich brauche die höchste dritte Zahl für einzigartiges Paar ersten beiden Zahlen x.x. zu finden Bei diesem Beispiel muss das erwartete Ergebnis 3.0.3, 2.9.5, 2.8.11 sein.

+2

obwohl ich wirklich Kopfzerbrechen mag. Wir erwarten, dass du schon etwas ausprobiert hast, hast du etwas versucht? – izk

+0

Diese Funktion kann helfen: http://php.net/manual/en/function.explode.php – Reversal

+0

Ja, ich versuche es herauszufinden. Ich habe versucht, die ersten beiden Werte zuerst zu bekommen und dann zu vergleichen, aber ich kann das nicht tun. foreach ($ array als $ key => $ wert) { $ test = substr ($ value, 0, 3); $ a = strtr ($ wert, array ('.' => '', ',' => '')); $ b = (int) $ a; $ c = Teilstr ($ b, 0, 2); $ new_array = array ($ c); $ result = array_unique ($ neuer_array); print_object ($ result); } – user2450639

Antwort

1

Zuerst müssen Sie die Versionen mit der Hauptversion gruppieren. Danach müssen Sie nur die Folge Gruppen mit der version_compare Funktion in absteigender Reihenfolge sortieren und das erste Element jeder Gruppe zurück:

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

Das Ergebnis wäre:

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

Das ist eigentlich ziemlich gut! Gute Arbeit!!! – user2450639

0

können Sie verwenden nur explode() und letzten Wert für jede Haupt varsion vergleichen, dann mit größerer und kleineren Version assoziative Array aufzubauen:

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

Output:

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