Нахождение значения в массиве php - PullRequest
0 голосов
/ 09 июня 2018

Последние 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 голосов
/ 09 июня 2018

Вместо того, чтобы выполнять отдельный запрос для каждого названия продукта и уровня продукта, сделайте их все в одном запросе, и позвольте 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)"
0 голосов
/ 09 июня 2018

То, как вы это делаете, приведет к созданию недопустимого 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 во внешнем интерфейсе

0 голосов
/ 09 июня 2018

простите мое форматирование, я на мобильном телефоне

Как сказал выше Амр Бераг, ваш результат должен быть первой строкой, возвращенной из вашего запроса.

Если выиметь такую ​​таблицу:

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)
...