182 / 182 / 83
Регистрация: 18.02.2014
Сообщений: 867
1

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

05.09.2016, 15:33. Показов 534. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет,
есть массив, с числами, хочу сделать проверку, дабы проверить что бы растояние между j и i не пересикались в массиве.

Пример:
Такой массив толжен будет вернуть что-то, так как есть пересечение чисел ([2] пересекается как с [0] так и с [1]).
PHP
1
2
3
4
5
$arr = [
  ['j' => 1, 'i' => 10],
  ['j' => 11, 'i' => 20],
  ['j' => 10, 'i' => 15],
];
Решение есть, но пока какие-то велосипеды у меня получаются. Как такое организовать стандартными функциями php с сallbacks?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.09.2016, 15:33
Ответы с готовыми решениями:

Добавление массива в многомерный массив (не элемента в многомерный массив)
Доброго времени суток уважаемые форумчане! Столкнулся с такой проблемой: требуется в многомерный...

Как переписать многомерный массив(матрица) с изменениями в новый массив
Здравствуйте, есть у меня двумерный массив. Если быть точнее то это матрица $maitrix = ,...

Многомерный массив
Имеется следующий массив: Array ( => Array ( => Что делает...

многомерный массив
есть массив: Array ( => Array ( => Array ( ...

7
461 / 369 / 94
Регистрация: 01.05.2010
Сообщений: 1,761
05.09.2016, 15:53 2
Не совсем понял, что имеется ввиду, но раз нужно искать пересечения, то возможно подойдет одна из функций, вычисляющих пересечения массивов: array_intesect, array_uintersect, или другие. Посмотри в этом мануале все функции, в имени которых встречается слово intersect, возможно одна из них подойдет.
1
182 / 182 / 83
Регистрация: 18.02.2014
Сообщений: 867
05.09.2016, 16:53  [ТС] 3
Зверушь, Да немного не так поняли, intesect найдёт совпадение, а мне надо промежуток можду чуслами включительно.
Как бы вот есть цикл в цикле, но как то это дело сделать более удобней для читабельности
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$arr = [
  ['j' => 1, 'i' => 10],
  ['j' => 12, 'i' => 22],
  ['j' => 20, 'i' => 21],
];
 
foreach ($arr as $key => $val) {
 
    foreach ($arr as $k => $v) {
 
        if ($key == $k) continue;
 
        if ($val['j'] >= $v['j'] && $val['j'] <= $v['i'])
            die('Range is already');
        elseif ($val['j'] <= $v['j'] && $val['i'] >= $v['i'])
            die('Range is already');
 
    }
 
}
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
05.09.2016, 20:37 4
Как вариант

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
$allValues = [];
 
$arr = [
  ['j' => 1, 'i' => 10],
  ['j' => 12, 'i' => 22],
  ['j' => 20, 'i' => 21],
];
 
foreach ($arr as $val) {
  $range = range($val['j'], $val['i']);
  if(count(array_intersect($allValues, $range)) > 0)die('Range is already');
  else{$allValues = $array_merge($allValues, $range);}
}
Добавлено через 18 минут
На больших числах правда код встанет, поэтому лучше

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$allRanges = [];
 
$arr = [
  ['j' => 1, 'i' => 10],
  ['j' => 12, 'i' => 22],
  ['j' => 20, 'i' => 21],
];
 
foreach ($arr as $val) {
  if(in_array($val['j'], $allRanges) || in_array($val['i'], $allRanges))die('Range is already');
  $allRanges[] = $val['j']; $allRanges[] = $val['i'];
  sort($allRanges);
  if($allRanges[array_search($val['j'], $allRanges) + 1] != $val['i'])die('Range is already'); //Проверяем, стоят ли наши числа друг за другом, если нет, значит пересечение
}
1
209 / 191 / 49
Регистрация: 15.03.2016
Сообщений: 1,211
05.09.2016, 20:40 5
через array_flip() и isset() можно по идее
1
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
05.09.2016, 20:51 6
Чуть поправлю свой вариант

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$allRanges = [];
 
$arr = [
  ['j' => 1, 'i' => 10],
  ['j' => 12, 'i' => 22],
  ['j' => 20, 'i' => 21],
];
 
foreach ($arr as $val) {
  if(in_array($val['j'], $allRanges) || in_array($val['i'], $allRanges))die('Range is already');
  $allRanges[] = $val['j']; $allRanges[] = $val['i'];
  sort($allRanges);
  $pos = array_search($val['j'], $allRanges);
  if($pos/2 != $pos % 2 || $allRanges[$pos + 1] != $val['i'])die('Range is already'); //Проверяем, стоят ли наши числа друг за другом, если нет, значит пересечение
}
1
182 / 182 / 83
Регистрация: 18.02.2014
Сообщений: 867
06.09.2016, 01:15  [ТС] 7
renat_dmitriev, Не понятно что вы тут хотели найти
PHP
1
$pos/2 != $pos % 2
Но тут он будет True почти всегда
Думаю задачу не правильно поняли, но всё-же спасибо )
0
392 / 294 / 121
Регистрация: 26.08.2016
Сообщений: 902
06.09.2016, 07:51 8
xpoince, Думаю задачу я понял правильно, вы можете запустить код и проверить. Задача: проверить не пересекается ли текущий диапазон с любым из предыдущих.

Смысл моего кода в следующем: мы добавляем j и i в массив, содержащий j и i всех предыдущих значений. После сортировки мы рассчитываем, что

а) j и i идут друг за другом
б) j находится на четной позиции, иначе они могут идти друг за другом, но быть внутри другого range. Код
PHP
1
$pos/2 != $pos % 2
как раз и проверяет четность позиции.
0
06.09.2016, 07:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.09.2016, 07:51
Помогаю со студенческими работами здесь

Многомерный массив
Нужна помощь по заданию. Суть такова, 7 цветов радуги, у каждого цвета свой диапазон волны. Вот сам...

Многомерный массив
Друзья, какой то страшный массив попался с непонятным для меня , не получается вывести данные из...

Многомерный массив
Здравствуйте, есть многомерный массив На примере Array ( =&gt; Array ( =&gt;...

Многомерный массив
Дана целочисленная прямоугольная матрица. Определить количество столбцов, не содержащих ни одного...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru