2017-01-14 1 views
0

Kennt jemand eine "bessere/sauberer/schneller" Möglichkeit, dies zu schreiben? Ich muss es für 29 verschiedene Marken (Acura, Honda, Toyota, usw.) tun, aber jede Marke hat ihre eigene spezifische Garantie Länge in Meilen und Zeit.Was ist eine bessere Möglichkeit, Informationen in einem Array nachzuschlagen?

if ($row['make'] == "Acura" && $row['mileage'] <= "70000" && date("Y")-6 < $year) { 
    $warr_Man = TRUE; 
} elseif ($row['make'] == "Audi" && $row['mileage'] <= "50000" && date("Y")-5 < $year) { 
    $warr_Man = TRUE; 
} 

Etwas stimmt nicht! Ich eingegeben in allen korrekten Daten, aber eine Störung erhalte: "Warnung: Invalid argument für foreach geliefert() in carcityofdanbury.com/New/vehicle.php on line 331"

$make = row['make']; 
    $year = $row['year']; 
    $mileage = row['mileage']; 

    $arr=[ 
     ['make' => Acura, 'mileage' => 70000, 'date' => 6], 
     ['make' => Audi, 'mileage' => 50000, 'date' => 5], 
     ['make' => BMW, 'mileage' => 50000, 'date' => 4], 
     ['make' => Buick, 'mileage' => 60000, 'date' => 5], 
     ['make' => Cadillac, 'mileage' => 60000, 'date' => 5], 
     ['make' => Chevrolet, 'mileage' => 60000, 'date' => 5], 
     ['make' => Chrysler, 'mileage' => 36000, 'date' => 3], 
     ['make' => Dodge, 'mileage' => 36000, 'date' => 3], 
     ['make' => Ford, 'mileage' => 60000, 'date' => 5], 
     ['make' => GMC, 'mileage' => 60000, 'date' => 5], 
     ['make' => Honda, 'mileage' => 60000, 'date' => 5], 
     ['make' => Hummer, 'mileage' => 60000, 'date' => 5], 
     ['make' => Hyundai, 'mileage' => 50000, 'date' => 5], 
     ['make' => Infiniti, 'mileage' => 70000, 'date' => 6], 
     ['make' => Isuzu, 'mileage' => 75000, 'date' => 7], 
     ['make' => Jaguar, 'mileage' => 50000, 'date' => 4], 
     ['make' => Jeep, 'mileage' => 36000, 'date' => 3], 
     ['make' => Kia, 'mileage' => 75000, 'date' => 5], 
     ['make' => Land Rover, 'mileage' => 50000, 'date' => 4], 
     ['make' => Lexus, 'mileage' => 70000, 'date' => 6], 
     ['make' => Lincoln, 'mileage' => 70000, 'date' => 6], 
     ['make' => Mazda, 'mileage' => 50000, 'date' => 4], 
     ['make' => Mercedes-Benz, 'mileage' => 50000, 'date' => 4], 
     ['make' => Mercury, 'mileage' => 60000, 'date' => 5], 
     ['make' => Mini, 'mileage' => 50000, 'date' => 4], 
     ['make' => Mitsubishi, 'mileage' => 100000, 'date' => 10], 
     ['make' => Nissan, 'mileage' => 60000, 'date' => 5], 
     ['make' => Porsche, 'mileage' => 50000, 'date' => 4], 
     ['make' => Scion, 'mileage' => 60000, 'date' => 5], 
     ['make' => Subaru, 'mileage' => 60000, 'date' => 5], 
     ['make' => Suzuki, 'mileage' => 100000, 'date' => 7], 
     ['make' => Mercury, 'mileage' => 60000, 'date' => 5], 
     ['make' => Toyota, 'mileage' => 60000, 'date' => 5], 
     ['make' => Volkswagen, 'mileage' => 60000, 'date' => 5], 
     ['make' => Volvo, 'mileage' => 50000, 'date' => 4], 
    ]; 
    $warr_Man = false; 

    foreach($rows as $row) { 
     foreach($arr as $v) { 
       $warr_Man = ($make == $v['make'] && $mileage <= $v['mileage'] && date("Y")-$v['date'] < $year) ? true : false; 

      if($warr_Man) //if matches break. 
     break; 
     } 
     if(!$warr_Man) //if one row not pass then break. 
    break; 
    } 
+0

würde '$ warr_Man' falsch sein, wenn nur eine Marke den Test nicht besteht? Woher kommen die Daten? – Jeff

+0

Ja. \t \t} sonst { \t \t \t $ warr_Man = FALSCH; \t \t} –

+1

Zeit, um die Magie von Arrays oder Datenbanken zu lernen. – bassxzero

Antwort

1

Wenn ich richtig verstehe, was Sie Ihren Code wollen, ist zu tun, zu bestimmen, ob die Garantie auf ein Auto noch gültig ist, dessen Kilometer und Jahr der Herstellung Sie abgerufen haben (ich gehe mal davon aus) ein Datenbank.

Betrachten Sie das Array, das Sie definiert haben, $arr: Es ist wie eine Miniatur-Datenbank selbst, die Informationen über Garantiebeschränkungen speichert, die von der Marke des Autos indiziert werden. Dies legt nahe, es besser strukturiert sein würde, wie ein zwei -dimensional assoziatives Array mit dem Auto als Schlüssel macht:

// An associative array of warranty-limit information, indexed by make of car 
$warranty_limits = [ 
    'Acura' => [ 
     'mileage' => 70000, 
     'years' => 6 
    ], 
    'Audi' => [ 
     'mileage' => 50000, 
     'years' => 5 
    ], 
    'BMW' => [ 
     'mileage' => 50000, 
     'years' => 4 
    ], 
    // ... 
]; 

Dies ermöglicht es uns, schnell die Garantieinformationen für eine bestimmte Herstellung nachschlagen, wie folgt aus:

$warranty_limit = &$warranty_limits['Audi']; 

(Das Zeichen-Zeichen bedeutet, dass wir den Interpreter für ein reference auf das Array-Element fragen, was es spart von Zeit zu verschwenden für uns eine Kopie des Elements zu machen. Wenn Sie das verwirrend finden, können Sie einfach den Ampersand auslassen - Der Leistungsunterschied ist in diesem Fall vernachlässigbar.)

Dies ist viel effizienter als die Iteration durch das Array Element-für-Element, wie Sie gerade in Ihrem foreach Block, da wir PHP-Fähigkeit verwenden, ein Array-Element mit seinem Schlüssel zu schnell nachschlagen Bring uns direkt zu den Daten, die wir brauchen.

Sobald wir dies getan haben, können wir die Details der Garantie als Elemente der Sub-Array zugreifen wir abgerufen haben:

$audi_mileage_limit = $warranty_limit['mileage']; 
$audi_years_limit = $warranty_limit['years']; 

Mit dem $warranty_limits Array wie oben definiert, Ihr Code könnte Sieht so aus:

// Fetch the data for this car 
$make = $row['make']; 
$mileage = $row['mileage']; 
$year = $row['year']; 

// Assume its warranty is not valid 
$warranty_valid = FALSE; 

// Check whether we have warranty information for this make of car 
if (array_key_exists($make, $warranty_limits)) { 
    // We do; retrieve it 
    $warranty_limit = &$warranty_limits[$make]; 

    // If this car is still within the manufacturer's limits, its warranty 
    // is valid 
    if ($mileage <= $warranty_limit['mileage'] and 
     (date("Y") - $warranty_limit['years']) < $year) { 
     $warranty_valid = TRUE; 
    } 
} 
else { 
    // This make of car is unknown to us; handle this error case 
    // ... 
} 
0

Wenn die Daten für diejenigen, Autos sind noch nicht in einem strukturierten Datensatz, stecken Sie es in einen! Dies ist die einfachste Form: ein Array.

<?php 
$makes = Array(
       Array(
       "name"=>"Acura", 
       "mileage" =>70000, 
       "years" => 6 
       ), 
       Array(
       "name"=>"Audi", 
       "mileage" =>50000, 
       "years" => 5 
       ) 
     ); 

print_r($makes); 

$warr_Man = false; 

    // test-data that will come from a db I suppose 
    $row['make'] = "Audi"; 
    $row['mileage'] = 4000; 
    $year = 2017; 

foreach($makes as $make) { 
    if ($row['make'] == $make['name'] && $row['mileage'] <= $make['mileage'] && date("Y")-$make['years'] < $year) { 
     // you might want to turn around the logic here: if mileage>mileage set $warr_Man to false 
     $warr_Man = true; 
    } 
} 
echo "warr_Man: ".$warr_Man; 
?> 

Hinweis: Dies ist die einfachste Implementierung, nicht die schönste. Dieser Fall könnte der Beispiel für die Einführung in OOP sein: Ihre Autos sind Objekte mit bestimmten Eigenschaften.

0

speichern Sie die verglichenen Elemente als ein Array $ arr, dann foreach verwenden, um sie zu überprüfen.

$arr=[['make' => Acura, 'mileage' => 70000, 'date' => 6], .....]; 
$warr_Man = false; 
foreach($rows as $row) 
{ 
    foreach($arr as $v) 
    { 
     $warr_Man = ($row['make'] == $v['make'] && $row['mileage'] <= $v['mileage'] && date("Y")-$v['date'] < $year) ? true : false; 
     if($warr_Man) //if matches break. 
      break; 
    } 
    if(!$warr_Man) //if one row not pass then break. 
     break; 
} 
+1

'$ arr ['make']' sollte '$ v ['make']' sein, richtig? – Jeff

+0

@Jeff ja, ich bearbeite es jetzt. –

Verwandte Themen