在数组中查找信息的更好方法是什么?

时间:2017-01-14 16:14:36

标签: php arrays if-statement

有没有人知道"更好/更清洁/更快"写这个的方法?我必须为29个不同的品牌(讴歌,本田,丰田等)做这件事,但每个品牌都有自己的特定保修长度(英里和时间)。

Thread.currentThread().getContextClassLoader().getResourceAsStream(name)

出了点问题!我输入了所有正确的数据,但是收到错误:"警告:在第331和34行的carcityofdanbury.com/New/vehicle.php中为foreach()提供的参数无效;

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

3 个答案:

答案 0 :(得分: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
    // ...
}

答案 1 :(得分: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的介绍:您的汽车是具有一定属性的对象。

答案 2 :(得分: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;
}