Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php数组中查找值_Php_Arrays_For Loop_Match - Fatal编程技术网

在php数组中查找值

在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=

在过去的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);

    }
}
请原谅我的格式设置,我在手机上

正如上面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);