在php数组中查找值
在过去的2-3天里,我一直在为这个问题绞尽脑汁,试图从尽可能多的不同角度来看待这个问题,但都无济于事。我正在向SO社区寻求额外的视角。下面是我打印所有9个产品计划的代码。我想找到并打印定价等于或最接近给定用户输入的计划。我该怎么做在php数组中查找值,php,arrays,for-loop,match,Php,Arrays,For Loop,Match,在过去的2-3天里,我一直在为这个问题绞尽脑汁,试图从尽可能多的不同角度来看待这个问题,但都无济于事。我正在向SO社区寻求额外的视角。下面是我打印所有9个产品计划的代码。我想找到并打印定价等于或最接近给定用户输入的计划。我该怎么做 //arrays of productnames $productnames=array(1=>"Beginner","Advanced","Expert"); //arrays of productlevels $productlevels=array(1=
//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);
}
}
请原谅我的格式设置,我在手机上
正如上面Amr Berag所说,您的结果应该是查询返回的第一行
如果您有这样一张桌子:
ID value
---- ------
A 7
B 12
C 23
...
然后,您可以从此表中选择,以查找最接近某个值的值,如下所示:
(假设所需值为$value)
这将返回如下内容(假设$VALUE为10):
你可以选第一排
您还可以使用MIN
功能添加WHERE子句,以仅选择差异最小的行:
SELECT id, value, ABS(value - $VALUE) AS diff
FROM your_table
WHERE diff = MIN(diff)
不要对每个产品名称和产品级别执行单独的查询,而是在一个查询中进行所有查询,让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)"
这样做会产生无效的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);
$result=array();
对于($prn=1;$prn$prodArray['name'],'planLevelID'=>$prodArray['planLevelID'],
'planLevelName'=>$prodArray['level'],
“planPrice”=>$prodArray['finalProductPrice'];
//打印产品阵列
$resul[]=$resultArr;
}//回路1
}//回路2
echo json_编码($result);
你还应该在前端添加limit 1,并在JS中完成剩余部分问题出在哪里?@AmrBerag:我如何找到定价与用户输入相等或最接近的计划?如果我在forloops中执行,它将打印所有9个计划,而不管我执行什么操作。出于某种原因,我需要在循环外执行,但我不知道如何执行。我想我们的sql运行得很好,是吗?@AmrBerag:是的,整个代码运行得很好,打印得也很好。拿第一个来说,它应该是一个,当prl=1度时,你是个天才。工作得很好。
SELECT id, value, ABS(value - $VALUE) AS diff
FROM your_table
WHERE diff = MIN(diff)
$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)"
$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);