Возвращает число в массиве, которое больше X

Следующий код автоматически находит самую высокую цену на странице:

    $vw_link = get_field('shop_link');

    $ch = curl_init($vw_link);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $cl = curl_exec($ch);

    $dom = new DOMDocument();
    @$dom->loadHTML($cl);
    $xpath = new DOMXpath($dom);

    $price = $xpath->query("//span[@class='price']");

    foreach($price as $value) { 
    $vw_array[] =  floatval(str_replace('$', '', $value->nodeValue));
    update_field('shop_price',max($vw_array));
    }

Что было бы лучше, так как нарезанный сыр, это если бы он мог вернуть значение в $vw_array, которое находится между определенной суммой, т. е. больше 100 и меньше 200. Сложная часть будет возвращать first наибольшее число после 100, если есть несколько чисел между 100-200.

Например (если все следующие цены включены в класс "цена"):

$88

$92

$105  <-- return this number

$125

$180

$210

Кто-нибудь знает, как придумать такую ​​великолепную функцию?


person Guit4eva    schedule 17.01.2015    source источник


Ответы (4)


function getHighestValue($arr, $high = 200, $low =100) {
    $data = $arr;
    // sort it so you can find 1st highest value in range
    asort($data);

    foreach ($data as $item) {
    //trim dollar sign as i can see from your example
        $item = ltrim($item, "$");
        if ($item >= $low && $item <= $high) {
            return $item;
        }
    }
  return false;
}

Итак, если ваши данные

$arr = [
    '$140',
    '$22',
    '$143',
    '$199',
];

var_dump(getHighestValue($arr)); // will return 140

Также вы можете добавить знак доллара обратно после этого

person Peter Popelyshko    schedule 17.01.2015

Я думаю, если я правильно вас понял, это должно сработать. Вы можете удалить свой $, если он есть.

function ReturnFirst($array = array(), $low = 0, $high = 0) {
        foreach($array as $value) {
                if(($value >= $low) && ($value <= $high)) {
                        // When first number hit, just return it
                        return $value;
                    }
            }
        // This will return false if it doesn't return any results
        return false;
    }

echo
$number =   ReturnFirst(array(10,20,30,40,50,60), 35,60);

// This will return the number 40
person Rasclatt    schedule 17.01.2015
comment
вам нужно отсортировать элементы - person Petro Popelyshko; 17.01.2015
comment
@nkmk Я не думаю, что вам нужно его сортировать. Это произойдет раньше в большом массиве, правда, но вам не нужно нужно сортировать его, чтобы он работал. - person Rasclatt; 17.01.2015
comment
Большое спасибо за ваш ответ :) - person Guit4eva; 17.01.2015

Предполагая стандартный отсортированный массив, то есть элементы в порядке возрастания или убывания с индексами 0, 1, 2,..., самым быстрым способом для большего массива будет алгоритм двоичного поиска.

// assuming sorted $a, looking for $value as lowest value
$low = 0;
$high = count($a);
while ($low < $high) {
  $middle = (($high - $low) >> 1) + $low; // same as floor(($high - $low) / 2)
  if ($a[$middle] < $value) // or: strcmp($a[$middle], $value) < 0
    $low = $middle + 1;
  else
    $high = $middle;
}

В конце переменная $low будет содержать самый ранний возможный индекс вставки для $value в отсортированном массиве. Другими словами, если $low меньше длины массива, он будет указывать на нужное значение, если оно меньше верхней границы значения. В противном случае массивы не содержат значения, соответствующего вашему запросу.

Однако, если вы имеете дело только с более короткими массивами, линейный поиск может быть быстрее из-за меньшей сложности.

person Wormbo    schedule 17.01.2015

Код:

$Max = 15;
$Min = 10;

$A = ['$6','$7','$9','$11','$12','$13','$17','$22']; // Array in

foreach($A As $V){
    $B = ltrim($V, "$");

    if($B >= $Min && $B <= $Max) {
        $C[] = $V;
    }
}

print_r($C);

Выход:

$11
$12
$13
person Saif    schedule 28.04.2017