2015-02-16 2 views
1
array (age) { 
    [0] -> 
     [0] =>12 
     [1] => - 
     [2] =>16 
    [1] -> 
     [0] =>14 
     [1] => - 
     [2] =>18 
} 

У меня есть динамический многомерный массив, который содержит возрастные группы. Я хочу проверить их, если эти возрастные группы перекрывают друг друга. В приведенном выше примере: возрастная группа 12-16 будет перекрываться с 14-18, и в этом случае я хочу выбросить ошибку.Проверьте, не конфликтуют ли возрастные группы в многомерном массиве

Если у вас есть вложенные foreach и для циклов, но я просто могу понять, как это правильно.

Вот что я пробовал:

foreach ($group as $k => $g) { 
    $g1[] = $g[0]; 
    $g2[] = $g[2]; 
} 

foreach ($g1 as $k => $g) { 
    if ($g < $g2[$k]) { 
    foreach ($g2 as $l => $gg) { 
     if ($gg < $g[$l]) { 
     echo 'overlap'; 
     } 
    } 
    } 
} 

Как вы можете видеть, я пошел с разделения массива на два, но это не представляется эффективным. Какие-либо предложения?

+0

Имеет ли массив всегда три значения и являются ли клавиши 0 и 2 всегда верхней и нижней границей? – chris85

+0

@ chris85 Да, это всегда будет выглядеть так. – Led

ответ

2

Я бы создал для обеих возрастных групп диапазон массивов и посмотрел, есть ли какие-либо сходства (array_intersect()).

$age_range1 = range($array[0][0], $array[0][2]); 
$age_range2 = range($array[1][0], $array[1][2]); 
$intersect = array_intersect($age_range1, $age_range2); 
if(count($intersect) > 0) { 
    //throw exception 
} 

Если массив возрастной группы является динамическим (более 2), вам нужно, конечно, генерировать массив диапазоны динамически и сравнить его друг с другом через две петли.

$array = array(0 => array(0 => 12, 2 => 18), 1 => array(0 => 19, 2 => 20), 2 => array(0 => 19, 2 => 35)); 

$similarities = false; 
for($k = 0; $k < count($array); $k++) { 
    $master = range($array[$k][0], $array[$k][2]); 

    for($i = 1; $i < count($array); $i++) { 
     $age_range = range($array[$i][0], $array[$i][2]); 
     $intersect = array_intersect($master, $age_range); 
     if(count($intersect) > 0) { 
      $similarities = true; 
      break; 
     } 
    } 
} 

if($similarities == true) { 
    echo 'found exception'; //throw exception 
} else { 
    echo 'found nothing'; 
} 
Смежные вопросы