2017-01-14 31 views
0

有沒有人知道「更好/更清潔/更快」的方式來寫這個?我必須爲29個不同品牌(謳歌,本田,豐田等)做到這一點,但每個品牌都有自己的特定保修長度,以英里和時間爲單位。什麼是查找數組中信息的更好方法?

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

有什麼不對!我在所有正確的數據輸入,但我得到一個錯誤:「:在carcityofdanbury.com/New/vehicle.php線331的foreach(提供了無效參數)警告」

$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

如果只有一個品牌未通過測試,'$ warr_Man'是否將爲false?數據來自哪裏? – Jeff

+0

是的。 \t \t} else { \t \t \t $ warr_Man = FALSE; \t \t} –

+1

有時間學習數組或數據庫的魔力。 – bassxzero

回答

1

如果我理解正確的話,你希望你的代碼做的是確定保修期是否仍然在汽車,其行駛里程和年生產的,你已經從檢索到的有效東西(我假設)一數據庫。

考慮你定義的數組,$arr:它就像一個微型數據庫本身,它存儲有關保修限制的信息,並由汽車製造索引。這表明,這將是更好的結構與車上維關聯數組使作爲鍵:

// 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 
    ], 
    // ... 
]; 

這使我們能夠快速查找保修信息的特定品牌,就像這樣:

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

(&符號意味着我們要求解釋器爲數組元素設置一個reference,這樣可以避免浪費時間爲我們複製元素的副本。如果您覺得混淆,可以將&符號 - 這種情況下的性能差異可以忽略不計。 )

這比通過逐個元素遍歷數組效率更高效,就像您當前在foreach塊中所做的那樣,因爲我們正在使用PHP的快速查找數組元素的鍵,直接帶我們到我們需要的數據。

一旦我們做到了這一點,我們可以訪問保修的細節,我們已經取得的子數組的元素:

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

有了如上定義的$warranty_limits陣列,你的代碼可能看起來像這樣:

// 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

如果這些數據汽車還沒有結構化的數據集,把它合併成一個! 這是最簡單的形式:一個數組。

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

注意:這是最簡單的實現,而不是最美麗的。這種情況可能是示例的介紹OOP:您的汽車是具有一定屬性的對象。

0

將比較的項目保存爲數組$ arr,然後使用foreach檢查它們。

$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']'應該是'$ v ['make']',對吧? – Jeff

+0

@Jeff是的,我現在編輯它。 –

相關問題