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

    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} является наиболее близким";
    }
    Ответ написан
    Комментировать
  • Как найти самое близкое значение в многомерном массиве?

    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
    Ответ написан
    1 комментарий
  • Почему среднее значение разное?

    0xD34F
    @0xD34F Куратор тега JavaScript
    Второй параметр в range - это количество элементов, а не конечное значение (как вам, по-видимому, показалось).

    То есть, в первом случае последовательность такая: 1, 2, 3, 4, 5. А во втором такая: 0, 1, 2, 3, 4. Соответственно, 15 / 5 = 3, 10 / 5 = 2, всё правильно.
    Ответ написан
    Комментировать