2017-04-26 3 views
1

Ich möchte den kleinsten Wert von einem Array finden und diesen Wert von allen Elementen subtrahieren, bis alle Elemente 0 werden. Das Problem ist, wenn das Array eines der Elemente enthält als 0 dann reflektiert es nichts. Danke im Voraus.So erhalten Sie einen minimalen positiven Wert größer als 0 in PHP

<?php 

$handle = fopen ("php://stdin","r"); 
fscanf($handle,"%d",$n); 
$arr_temp = fgets($handle); 
$arr = explode(" ",$arr_temp); 
array_walk($arr,'intval'); 

for($j=0;$j<10;$j++) 
{ 
    $min = min($arr); 
    for($i=0;$i<count($arr);$i++) 
    { 
     if($arr[$i]>=$min) 
      $arr[$i]-=$min; 
     echo $arr[$i]." "; 
    } 
    echo "\n"; 
} 

?> 
+1

zeigen Sie uns Ihren Code – webpic

+0

Ignorieren 0 Werte? if ($ var === 0) fortfahren; ? –

+0

siehe hier: http://stackoverflow.com/questions/6748836/min-function-that-ignores-negative-values-in-php –

Antwort

1

Mit array_filter() sowie eine Funktion können Sie die minimale positive ganze Zahl ungleich Null sogar, wenn ein Array-Elemente enthält, deren Wert gleich Null ist, wie folgt:

<?php 

$arr = array(0, 1, 2, 3, 4, 0, 5, 6, 4, 3, 2, 1,0); 

function getMin($a) { 
    $arr_filtered = array_values(array_filter($a)); 
    return min($arr_filtered); 

} 

$min = getMin($arr); 

$count = count($arr); 

while(count(array_unique($arr)) > 1) { 


    for($i = 0; $i < $count; $i++) 
    { 
     if($arr[$i] >= $min){ 
      $arr[$i] -= $min; 
      echo $arr[$i]." "; 
     } 
    } 
echo "\n"; 
} 

Siehe demo

Hinweis: Der Code indiziert das gefilterte Array in getMin() mithilfe von array_values ​​() neu.

Solange der Mindestwert eins ist, funktioniert das obige Skript gut. Wenn der Mindestwert jedoch eine andere Zahl ist, muss der Code angepasst werden. Das folgende Skript übernimmt ein mehrdimensionales Array, bestehend aus vier Feldern, die jeweils mit einem unterschiedlichen Minimalwert, eines davon mit negativen Werten:

<?php 
error_reporting(E_ALL); 

$a = [ [0,1, 2, 3, 4, 0, 5, 6, 4, 3, 2, 1,0], 
     [0, 2, 3, 4, 0, 5, 6, 4, 3, 2, 0], 
     [0, 3, 4, 0, 5, 6, 7,8,4, 3, 0], 
     [-1,0,1,2,3,4,2,1,0,-1] 
    ]; 

function getMin($a) { 

    return min($a); 

} 


foreach ($a as $arr) { 
while(($arr != null) ) { 
    $arr = array_values(array_filter($arr)); 
    if ($arr == null) { 
    break; 
    } 
    $min = getMin($arr); 

    foreach ($arr as &$e) { 
      $e -= $min; 
    } 
    unset($e); 
    echo join(" ",$arr),"\n"; 
} 
echo "\n"; 
} 

siehe demo

Note, die zweite Skript filtert explizit die Null Werte in jedem Array, während das erste Skript effektiv tut dies. Der Hauptunterschied zwischen den beiden Skripten besteht darin, dass sich getMin() in der while-Schleife befinden muss, damit die Subtraktion korrekt ausgeführt wird, wenn die minimale Zahl größer als eins ist oder eine negative Zahl ist.

Das Skript vereinfacht den Code auf verschiedene Arten. Viel einfachere Bedingung für die while-Schleife - funktioniert solange das Array nicht null ist. Der Code benötigt nicht mehr getCount(), da ich die Subtraktionsschleife geändert habe, um eine foreach mit einer Referenzvariablen zu verwenden, die anschließend nicht gesetzt ist - wichtig, um Probleme zu vermeiden. Diese foreach-Schleife erfordert auch nicht das if-Bedingungsmerkmal des ersten Skripts.

0

Ich weiß nicht viel über PHP, aber in der ersten for Schleife sollten Sie die Elemente des Arrays überprüfen, ob sie mit Null sind oder nicht, wenn Aussagen if(arr[j]!=0) zB

for($j=0;$j<10;$j++) 
{ 
    if($arr[$j]!=$0) 
    $min = min($arr); 
    for($i=0;$i<count($arr);$i++) 
    { 
     if($arr[$i]>=$min) 
      $arr[$i]-=$min; 
     echo $arr[$i]." "; 
    } 
    echo "\n"; 
} 
1

es, weil Sie ist Nehmen Sie jedes Mal $min = min($arr); Wert und es wurde 0 thats warum Ihr Code nicht funktioniert. versuchen Code unten

$min = min($arr); 
for($j=0;$j<=100;$j++) 
{ 
if (count(array_unique($arr)) === 1 && end($arr) === 0) { 
break; 
} 
    for($i=0;$i<count($arr);$i++) 
    { 
     if($arr[$i] >= $min){ 
      $arr[$i]-=$min; 
     echo $arr[$i]." "; 
    } 
    } 
echo "<br>"; 
} 
Verwandte Themen