2015-07-06 4 views
0

У меня есть массив как это:PHP, как найти следующий большее значение ключа из массива

$pricing = array(
       "2" => 8.23, 
       "5" => 10.97, 
       "10" => 13.28, 
       "15" => 15.40, 
       "20" => 18.15, 
       "25" => 20.36, 
       "30" => 22.84, 
       "40" => 25.60, 
       "50" => 28.35, 
       "60" => 31.89, 
       "70" => 36.23, 
       "80" => 39.40, 
       "90" => 42.52, 
       "100" => 44.75 
       ); 

И у меня есть переменный, которая имеет клиент данного значения от 1 до 100.

Вопроса : какой лучший и быстрый способ найти следующий самый большой ключ, если сам ключ не существует?

E.g. У меня есть переменная со значением 12, и мне нужно получить цену за это. В соответствии с массивом здесь цена будет равна 15,40, потому что следующий самый большой ключ равен 15.

Я мог бы попробовать найти номер ключа «12», и если он не существует, я бы добавил один (12 + 1)) и повторите попытку, пока не будет найден следующий ключ, но есть ли какая-либо функция, которая может сделать это для меня или что-то еще лучше/быстрее?

Редактировать: Разъяснение структуры массива.

Array, как в примере здесь. Ключи упорядочены, как видно.

+2

'foreach ($ priceicing as $ key => $ value)', 'if ($ key> = $ needle) break;' - это два основных строительных блока, которые вы можете использовать для составило простое решение. – deceze

+1

@deceze верен, foreach, вероятно, самый быстрый и простой код для этого. Вероятно, вы должны установить значение $ price = $; и проверьте $ price с isset(). – OIS

+0

@ mc.watras Отредактированный вопрос немного. Я не вижу, как влияют значения, но они такие же, как в примере. Ключи упорядочены, как в примере. Изменить: Извините, я смешал значения и ключи. Отредактировано снова. :) – GotBatteries

ответ

2

Простой foreach будет делать, но для защиты от либо пустых массивов или иголки, что это выше, чем самый высокий ключ, вот реализация, которая будет Кроме того:

function find(array $pricing, $needle) 
{ 
    $last = null; // return value if $pricing array is empty 

    foreach ($pricing as $key => $value) { 
     if ($key >= $needle) { 
      return $key; // found it, return quickly 
     } 
     $last = $key; // keep the last key thus far 
    } 

    return $last; 
} 

$result = find($pricing, 12); // 15 
$result = find($pricing, 101); // 100 
$result = find([], 12); // null 
+1

Все представленные коды кажутся хорошо выполненными, поэтому выбор победителя идет на тот, который имеет похожий стиль кодирования, как и я. Я не помню, когда в последний раз я использовал do-while. :) Спасибо всем, кто внес свой вклад! – GotBatteries

0

Ваша логика в порядке, вы можете сделать это с помощью следующего() http://php.net/manual/en/function.next.php

$search = 12; 
$pricing = array(
       "2" => 8.23, 
       "5" => 10.97, 
       "10" => 13.28, 
       "15" => 15.40, 
       "20" => 18.15, 
       "25" => 20.36, 
       "30" => 22.84, 
       "40" => 25.60, 
       "50" => 28.35, 
       "60" => 31.89, 
       "70" => 36.23, 
       "80" => 39.40, 
       "90" => 42.52, 
       "100" => 44.75 
       ); 

$result = null; 
if (!isset($pricing[$search])) { 
    do { 
    } while (next($pricing) && $search > key($pricing)); 
    $result = current($pricing); 
} else { 
    $result = $pricing[$search]; 
} 

echo $result; 
+0

И как мне искать следующую самую важную ключевую ценность здесь? – GotBatteries

+0

Я обновил и добавил больше кода, пожалуйста, посмотрите – Dezigo

1

Предполагая, что вы ищете «requiredKey» и что массив отсортирован по ключевым

Это, кажется, делай что хочешь.

Код:

<?php 

$pricing = array(
       "2" => 8.23, 
       "5" => 10.97, 
       "10" => 13.28, 
       "15" => 15.40, 
       "20" => 18.15, 
       "25" => 20.36, 
       "30" => 22.84, 
       "40" => 25.60, 
       "50" => 28.35, 
       "60" => 31.89, 
       "70" => 36.23, 
       "80" => 39.40, 
       "90" => 42.52, 
       "100" => 44.75 
       ); 

// What key we want... 
$requiredKey = 12; 

// outout in here 
$foundKey = -1; 
$foundValue = -1; 

// always run the loop once... 
do { 
    $foundKey = key($pricing);  // store the current details 
    $foundValue = current($pricing); 

    next($pricing); // will be equal or greater 
} 
while ( current($pricing) !== false 
     && $foundKey < $requiredKey); 


echo '<pre>'; 
echo '<br />', 'key: ', $foundKey, ' value: ', $foundValue; 
echo '</pre>'; 

Выход:

key: 15 value: 15.4 
+0

Почему бы просто не использовать 'foreach()' и сломать, когда условие выполнено? –

+0

не сортировать массив по ключу перед использованием этого цикла. – Daimos

+0

@Daimos Массив уже отсортирован по ключу, согласно OP. –

-1

Если вы получаете $ price из базы данных, вы можете найти значение databasikally

+0

Здесь нет db. Если бы это было так, это было бы заявлено в вопросе, но спасибо за напоминание. – GotBatteries

Смежные вопросы