Доброго времени суток! Столкнулся с одной проблемой, никак не могу решить. Есть массив с отрезками времени в unix-формате (в примере обычные числа): Код (Text): Array ( [0] => Array ( [date_in] => 10 [date_out] => 20) [1] => Array ( [date_in] => 20 [date_out] => 40 ) [2] => Array ( [date_in] => 30[date_out] => 50 ) [3] => Array ( [date_in] => 100 [date_out] => 200 ) [4] => Array ( [date_in] => 110 [date_out] => 250 ) ) Мне нужно сложить отрезки (если пересекаются) и получить общие. То есть в моем примере будет массив: Код (Text): Array ( [0] => Array ( [date_in] => 10 [date_out] => 50) [1] => Array ( [date_in] => 100 [date_out] => 250 ) ) Написал код: Код (Text): for ($i = 0, $size = count($array); $i < $size;) { if ($array[$i]['date_out'] >= $array[$i+1]['date_in']) { if ($array[$i]['date_out'] <= $array[$i+1]['date_out']) { $array[$i]['date_out'] = $array[$i+1]['date_out']; array_splice($array, $i+1, 1); $i = $i+1; } else { array_splice($array, $i+1, 1); $i = $i+1; } } else { $i = $i+1; } } В итоге соединяются только два соседних пересекающихся, а если пересекает третий, то он становится новым элементом конечного массива. Проблема известна: если элементы [0] и [1] пересекаются, срабатывает array_splice, который и удаляет элемент [1]. Элементы сдвигаются и цикл начинается с [1] и не учитывает сложившийся элемент[0]. Вопрос: как возможно заставить цикл for работать несколько раз с одним элементом?
а зачем? могу предложить вариант обработки. функции добавлены исключительно для большей наглядности. Код (PHP): <?php function isIntersect($a, $b) { return ($b['date_in'] <= $a['date_out']) && ($b['date_out'] >= $a['date_in']); } function merge($a, $b) { return array( 'date_in' => min($a['date_in'], $b['date_in']), 'date_out' => max($a['date_out'], $b['date_out']) ); } $a = array( array('date_in' => 10, 'date_out' => 20), array('date_in' => 20, 'date_out' => 40), array('date_in' => 30, 'date_out' => 50), array('date_in' => 100, 'date_out' => 200), array('date_in' => 110, 'date_out' => 250), ); $n = count($a); for ($i = 0; $i < $n; ++$i) { if (!isset($a[$i])) { continue; } for ($j = $i + 1; $j < $n; ++$j) { if (isIntersect($a[$i], $a[$j])) { $a[$i] = merge($a[$i], $a[$j]); unset($a[$j]); } } } header('Content-type: text/plain; charset=utf-8'); var_export($a);
Опробовал - работает! Думал, что с unset будет сложнее и решил использовать array_splice. Оказалось всё наоборот Огромное спасибо, artoodetoo! Тему можно закрывать.