Итерация по отсортированному ассоциативному массиву - PullRequest
1 голос
/ 11 июня 2019

У меня есть массив с положительными значениями типа int, как [4, 1, 75, 52, 5, 24].Мне нужно найти два значения с минимальной разницей.Кроме того, мне нужны оригинальные ключи этих двух.Итак, я отсортировал массив с asort(), чтобы сохранить ключи.Теперь, когда я выполняю итерацию, у меня возникает проблема - я не могу использовать $key + 1 для указания на следующий элемент, а использование next() и prev() затрудняет получение ключей (когда вы используете следующий или предыдущий указатель перемещается):

for ($i = 0; $i < count($sorted)-1; $i++) {
  if (current($sorted) - next($sorted) < $min) {
    //echo prev($sorted) - next($sorted) . '<br>'; 
  }
}

Что бы вы сделали?
(не стесняйтесь изменять массив в любой другой форме, если это облегчает - asort не требуется)

Если мне нужнообъясните еще раз: у меня проблема с ключами.Поиск ближайших значений не является проблемой.

Ответы [ 2 ]

0 голосов
/ 12 июня 2019

Я нашел свой собственный способ сделать это, используя дополнительный массив с ключами и array_multisort()

$numbers = [4, 1, 75, 1, 52, 5, 52, 24, 52];
$ar = [];
$mins = [];
$min = PHP_INT_MAX;
foreach ($numbers as $key => $number) {
    $ar[] = ['key' => $key, 'number' => $number];
}

array_multisort(array_column($ar, 'number'), SORT_DESC, array_column($ar, 'key'), SORT_DESC, $ar );

foreach ($ar as $key => $value) {
    if (!isset($ar[$key + 1])) break;
    if ($value['number'] - $ar[$key + 1]['number'] <= $min) {
        $min = $value['number'] - $ar[$key + 1]['number'];
        $mins = [$ar[$key + 1], $ar[$key]];
    }
}
0 голосов
/ 11 июня 2019

Я полностью обновил ваш фрагмент.Вы можете взять все, что хотите, из фрагмента ниже:

$array = [4, 1, 5, 52, 75, 52, 24];
function difference($arr)
{
    $n = count($arr);
// Initialize difference
    // as infinite
    $diff = PHP_INT_MAX;
// Find the min diff by comparing
    // difference of all possible
    // pairs in given array
    $two_values = [];
    for ($i = 0; $i < $n - 1; $i++) {
        for ($j = $i + 1; $j < $n; $j++) {
            if (abs($arr[$i] - $arr[$j]) < $diff) {
                $diff = abs($arr[$i] - $arr[$j]);
                $two_values['values'] = [$arr[$i], $arr[$j]];
                $two_values['keys']   = [$i, $j];
                $two_values['diff']   = $diff;
            }
        }
    }

// Return min diff
    return $two_values;
}
print_r(difference($array));

Демо .

Пожалуйста, дайте мне знать, если что-то не получается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...