Как искать максимальное значение в многомерном массиве в заданном диапазоне

#php #arrays #multidimensional-array

#php #массивы #многомерный массив

Вопрос:

У меня есть многомерный массив $array , который имеет множество различных значений. Я пытаюсь получить максимальное значение в заданном диапазоне, в данном случае, допустим, максимальное значение в пределах x1, y0 и x2, y7, таким образом, результатом будет 6 использование приведенных ниже данных.

Похоже, это обычная проблема для поиска в координатах в многомерном массиве… но я не могу найти простого решения, и все, что я пытаюсь сделать, кажется, довольно обширным в кодировании. Мне было интересно, существует ли функция, которая позволила бы мне выполнять поиск в этом массиве, используя мои критерии эффективным способом.

 $array[0][0] = 1;
$array[0][1] = 10;
$array[0][3] = 3;
$array[1[0] = 1;
$array[1][1] = 1;
$array[2][5] = 6;
  

Комментарии:

1. Вам нужно только максимальное значение или также координаты этого значения? Насколько велики ваши многомерные массивы и как часто вам нужно находить эти значения? Будет ли достаточно простого решения O (N), или вам нужно время регистрации или даже O (1)?

2. Попробуйте двумерный RMQ

Ответ №1:

 $array[0][0] = 1;
$array[0][1] = 10;
$array[0][3] = 3;
$array[1][0] = 1;
$array[1][1] = 1;
$array[2][5] = 6;

$max = false;
$x1 = 1; $x2 = 2;
$y1 = 0; $y2 = 7;

foreach($array as $x => $y_vals) {    
    if($x < $x1 || $x > $x2)
        continue;

    foreach($y_vals as $y => $val) {
        if($y < $y1 || $y > $y2)
            continue;

        if(false === $max || $max < $val)
            $max = $val;
    }
}

print $max; //6
  

Ответ №2:

 $max = null;
for ($x = $startx; $x <= $endx; $x  ) {
    for ($y = $starty; $y <= $endy; $y  ) {
        if (isset($array[$x][$y]) amp;amp; ($max === null || $array[$x][$y] > $max)) {
            $max = $array[$x][$y];
        }
    }
}
  

Ответ №3:

 $array[0][0] = 1;
$array[0][1] = 10;
$array[0][3] = 3;
$array[1][0] = 1;
$array[1][1] = 1;
$array[2][5] = 6;

$vals = array();
foreach (new RecursiveIteratorIterator(
             new RecursiveArrayIterator($array),
             RecursiveIteratorIterator::LEAVES_ONLY
         ) as $value) {
    $vals[] = $value;
}
$max = max($vals);
echo $max;