在php数组中查找值

时间:2018-06-08 23:29:22

标签: php arrays for-loop match

在过去的2-3天里,我一直在努力解决这个问题,试图从尽可能多的角度看问题,但无济于事。我正在转向SO社区寻求额外的观点。以下是我打印所有9个产品计划的代码。我想找到并打印定价等于或最接近给定用户输入的计划。我怎么能这样做?

//arrays of productnames
$productnames=array(1=>"Beginner","Advanced","Expert");

//arrays of productlevels
$productlevels=array(1=>"Bronze","Silver","Gold");

//Get The Length of Product Name Array
$planname_array_length=count($productnames);

//Get The Length of Product Level Array
$planlevel_array_length=count($productlevels);

for ($prn=1; $prn <= $planname_array_length; $prn++) {//loop to create plan name indicators 
    for ($prl=1; $prl <= $planlevel_array_length; $prl++) {//loop to create plan level indicators 

        $getpoductsql = " SELECT name, level,productNameId,productLevelId,finalProductPrice
                        FROM ( 
                        SELECT wspn.productName AS name, wspl.productLevel AS level, wsp.productNameId AS productNameId, wsp.productPlanLevel AS productLevelId, 
                        ROUND(SUM(`Price`) * 1.12) AS finalProductPrice,
                        FROM `products` ws 
                        left join product_plan wsp on wsp.productId = ws.wsid 
                        left join product_plan_level wspl on wsp.productPlanLevel = wspl.wsplid 
                        left join product_plan_name wspn on wspn.wspnid = wsp.productNameId 
                        WHERE wspn.productName = '$planname_array_length[$pn]' AND wspl.productLevel = '$planlevel_array_length[$pl]'
                        )
                        AS x ORDER BY ABS(finalProductPrice - $compareprice)"
            $resultproducts = $conn->query($getpoductsql);
        $prodArray = mysqli_fetch_array($resultproducts);

        //print array of each plan
        $resultArr = array('planNameID' => $prodArray['planNameId'], 
                           'planName' => $prodArray['name'], 
                           'planLevelID' => $prodArray['planLevelId'],
                           'planLevelName' => $prodArray['level'],
                           'planPrice' => $prodArray['finalProductPrice'];

                           //print arrays of products
                           echo json_encode($resultArr);

    }
}

这将输出9个计划如下:

{"planNameID":"1","productName":"Beginner","productLevelID":"1","productLevelName":"Bronze","productPrice":"15"}

3 个答案:

答案 0 :(得分:1)

不是对每个产品名称和产品级别执行单独的查询,而是在一个查询中执行这些查询,并让MySQL找到价格最接近的查询。

   $getpoductsql = " SELECT name, level,productNameId,productLevelId,finalProductPrice
                    FROM ( 
                    SELECT wspn.productName AS name, wspl.productLevel AS level, wsp.productNameId AS productNameId, wsp.productPlanLevel AS productLevelId, 
                    ROUND(SUM(`Price`) * 1.12) AS finalProductPrice,
                    FROM `products` ws 
                    left join product_plan wsp on wsp.productId = ws.wsid 
                    left join product_plan_level wspl on wsp.productPlanLevel = wspl.wsplid 
                    left join product_plan_name wspn on wspn.wspnid = wsp.productNameId 
                    WHERE wspn.productName IN ('Beginner', 'Advanced', 'Expert') AND wspl.productLevel IN ('Bronze', 'Silver', 'Gold')
                    GROUP BY productNameId, productLevelId
                    )
                    AS x ORDER BY ABS(finalProductPrice - $compareprice)"

答案 1 :(得分:0)

原谅我的格式,我在手机

与上面提到的Amr Berag一样,您的结果应该是从查询中返回的第一行。

如果您有这样的表:

ID    value
----   ------
A       7
B       12
C       23
...

然后您可以从此表中SELECT找到最接近某个值的内容,如下所示:

(假设您想要的值为$ VALUE)

SELECT id, value, ABS(value - $VALUE) AS diff
FROM your_table
ORDER BY diff ASC

这将返回类似这样的内容(比如说$ VALUE是10):

id  value  diff
--  ------  ----
B    12   2
A    7     3
C    23   13
...

你可以选择第一行。

您也可以添加WHERE子句,仅使用MIN函数选择差异最小的行:

SELECT id, value, ABS(value - $VALUE) AS diff
FROM your_table
WHERE diff = MIN(diff)

答案 2 :(得分:0)

你这样做会产生无效的json,就像这样:

  $result=array(); 
    for ($prn=1; $prn <= $planname_array_length; $prn++) {   
      for ($prl=1; $prl <= $planlevel_array_length; $prl++) {   
            .     .     .     // the other code   
     //print array of each plan          
   $resultArr = array('planNameID' => $prodArray['planNameId'],    
                             'planName' => $prodArray['name'],                                 'planLevelID' => $prodArray['planLevelId'],                 
               'planLevelName' => $prodArray['level'],   
        'planPrice' => $prodArray['finalProductPrice']; 
                                    //print arrays of products     
                            $resul[]=$resultArr;        
                                      }//loop1   
  }//loop2   

      echo json_encode($result);

你还应该添加限制1并在前端的JS中完成其余的工作