Обновлен код, который создает массив, но ISNT выводит значения min / max. Почему это не работает, и как я могу заставить его автоматически удалять значение min / max, а затем повторно массировать массив?
<?php $url = 'https://www.googleapis.com/shopping/search/v1/public/products?key=thekey&country=US&q=nintendo+wii'; $data = curl_init($url); curl_setopt($data, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($data, CURLOPT_HEADER, 0); $product_result = curl_exec($data); curl_close($data); $arr = json_decode($product_result, true); $prices = array(); echo "Original Values"; foreach ($arr['items'] as $item) { if (isset($item['product']['inventories'][0]['price'])) { $prices[] = $item['product']['inventories'][0]['price']; } } echo '<pre>'; print_r($prices); echo '<br /><br />'; // Get the values $min = $prices[$minIndex]; $max = $prices[$maxIndex]; // Find the values $minIndex = array_search($min, $prices); $maxIndex = array_search($max, $prices); #print out results with no min/max pair echo $prices[$min] . 'max is ' . $prices[$max]; echo '</pre>'; // Unset the values unset($prices[$minIndex], $prices[$maxIndex]); ?>
Текущий выход кода, который, как представляется, не показывает значение min / max:
Original Values Array ( [0] => 149.99 [1] => 149.99 [2] => 149.99 [3] => 209.95 [4] => 124.99 [5] => 225.99 [6] => 149.96 [7] => 249.99 [8] => 193.99 [9] => 149.99 [10] => 149.99 [11] => 149.99 [12] => 326.99 [13] => 269.96 [14] => 258.99 [15] => 129.99 [16] => 149.99 [17] => 39.99 [18] => 149.99 [19] => 209.99 [20] => 349.95 [21] => 357.38 [22] => 169.96 [23] => 125 [24] => 149.99 ) max is
На основе unset
и array_search
от php.net это должно работать:
// Find the values $minIndex = array_search($minVal, $prices); $maxIndex = array_search($maxVal, $prices); // Get the values $min = $prices[$minIndex]; $max = $prices[$maxIndex]; // Unset the values unset($prices[$minIndex], $prices[$maxIndex]); // Print out values echo 'min value: '.$min; echo 'max value: '.$max; // Print full array print_r($prices);
Вы можете отсортировать массив в числовом порядке, а затем использовать array_pop () и array_shift ()
sort($prices,SORT_NUMERIC); $maxval = array_pop($prices); $minval = array_shift($prices); $avgofval = (count($prices)) ? array_sum($prices)/count($prices) : 0; echo "min is ". $minval . "<br>Max is ". $maxval . "<br />avg is " . $avgofval ; echo '<pre>'.print_r($prices,1).'</pre>';
$minVal
и $maxVal
не определены перед вызовом поиска массива.
// Find the values $minIndex = array_search($minVal, $prices); $maxIndex = array_search($maxVal, $prices);
И array_search не находит никакого значения. Он найдет ключи: возвращает ключ для иглы, если он найден в массиве, в противном случае FALSE.
$minIndex
– FALSE
, а $maxIndex
также является FALSE
.
Значения также неверны …
// Get the values $min = $prices[$minIndex]; // $min = $prices[FALSE] $max = $prices[$maxIndex]; // $max = $prices[FALSE]
Возможное решение:
$minValue = FALSE; $maxValue = 0; foreach ($arr['items'] as $item) { if (isset($item['product']['inventories'][0]['price']) !== false) { $price = $item['product']['inventories'][0]['price']; $prices[] = $price; if ( ! $minValue || $minValue < $price) { $minValue = $price; } if ($price > $maxValue) { $maxValue = $price; } } }
В стороне
if (isset($item['product']['inventories'][0]['price']) !== false) { ... }
является избыточным тестом. Это точно так же, как
if (isset($item['product']['inventories'][0]['price'])) { ... }