@asmodeusta
PHP Developer (Laravel, Wordpress)

Как найти самое близкое значение в многомерном массиве?

Здравствуйте.
Не знаю как точно правильно сформулировать вопрос, пишу как есть:
Дано многомерный массив следующего вида:
[
  [1, 1, 1],
  [1, 2, 1],
  [1, 2, 2],
  [1, 5, 4],
  [1, 5, 6],
  [2, 1, 6],
  [2, 2, 2],
]

Массив всегда состоит из массивов по 3 элемента и отсортирован по возрастанию. И дано например следующий массив:
[1, 5, 5]
Как найти значение в первом массиве, которое было бы ближе всего (меньше или равно) ко второму массиву. Например для данного случаю это будет значение [1, 5, 4].
Надеюсь суть вопроса ясна.
  • Вопрос задан
  • 267 просмотров
Решения вопроса 2
sergiks
@sergiks Куратор тега PHP
♬♬
Раз отсортирован, значит надо просто идти подряд, пока не найдётся элемент, превышающий заданные значения. Вернуть предыдущий.

function nearest( $sample, $arr) {
  $found = false;
  foreach( $arr AS $row) {
    if($row[0] <= $sample[0]  &&  $row[1] <= $sample[1]  &&  $row[2] <= $sample[2]) $found = $row;
    else break;
  }
  
  return $found;
}

$data = [
  [1, 1, 1],
  [1, 2, 1],
  [1, 2, 2],
  [1, 5, 4],
  [1, 5, 6],
  [2, 1, 6],
  [2, 2, 2],
];

echo implode(',', nearest( [1,5,5], $data)); //  1,5,4
Ответ написан
kimono
@kimono
Web developer
/**
 * @param array $input
 * @param array $items
 *
 * @return int|null
 */
function compare(array $input, array $items)
{
    foreach ($items as $index => $item) {
        $compareResult = version_compare(implode('.', $input), implode('.', $item));
        if ($compareResult <= 0) {
            if ($compareResult === 0 || !array_key_exists($index - 1, $items)) {
                return $index;
            }

            return $index - 1;
        }
    }

    return null;
}

$items = [
    [1, 1, 1],
    [1, 2, 1],
    [1, 2, 2],
    [1, 5, 4],
    [1, 5, 6],
    [2, 1, 6],
    [2, 2, 2],
];
$input = [1, 5, 5];

if (null === $index = compare($input, $items)) {
    echo 'Элемент не найден';
} else {
    echo "Элемент под номером {$index} является наиболее близким";
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы