2015-04-27 2 views
0

Я получил многомерный массив как это:PHP: групповые элементы массива по два одинаковых значений

Array 
(
[0] => Array 
    (
     [posY] => 5 
     [posX] => 48.75 
     [id] => 36 
    ) 

... 

[5] => Array 
    (
     [posY] => 16 
     [posX] => 75 
     [id] => 15 
    ) 
) 

Мне нужно группировать элементы с одинаковыми значениями обоих PosX и Пози, например в группе с posX между 10 и 20, а posY между 5 и 10 будут элементами a (11,9), b (14,8), но не c (11, 15) или d (25,20).

Выход должен быть массив как это:

Array 
    (
    [1] => Array 
     (
      [0] => Array 
       (
        [posY] => 5 
        [posX] => 48.75 
        [id] => 36 
       ) 
     ) 

    [2] => Array 
     (
      [0] => Array 
       (
        [posY] => 5 
        [posX] => 52.5 
        [id] => 35 
       ) 

      [1] => Array 
       (
        [posY] => 5.5 
        [posX] => 18.75 
        [id] => 46 
       ) 

      [2] => Array 
       (
        [posY] => 7.5 
        [posX] => 52.5 
        [id] => 29 
       ) 
     ) 

    [3] => Array 
     ( 
      [0] => Array 
       (
        [posY] => 15 
        [posX] => 45 
        [id] => 49 
       ) 

      [1] => Array 
       (
        [posY] => 16 
        [posX] => 75 
        [id] => 15 
       ) 
     ) 
    ) 

Что путь пешком, хотя первый массив и сделать группы с элементами, имеющими как две одинаковые значения?

Tnx много!

+2

Что вы пытанали – Codelord

+1

Что вы пытаетесь? – madalinivascu

+0

Я попытался отсортировать начальный массив posX, затем пройти через массив и сравнить каждый элемент с предыдущим. Если значение posX элемента не похоже на предыдущее, увеличьте индекс элемента выходного массива, иначе индекс останется таким же. Результатом является выходной массив, показанный выше. Но таким образом я группирую только одно значение, а не как posX, так и posY. –

ответ

0

Одним из решений может быть рассчитать расстояние между точками и группировать их на основе декартовой близости, а не «цифры близки». Вы могли бы сделать что-то похожее на следующее (я не делают никаких заявлений, что это каким-либо образом оптимизированной):

$points = array(
    array('x' => 48.75, 'y' => 5, 'id' => 36), 
    array('x' => 52.5, 'y' => 5, 'id' => 35), 
    array('x' => 18.75, 'y' => 5.5, 'id' => 46), 
    array('x' => 52.5, 'y' => 7.5, 'id' => 20), 
    array('x' => 45, 'y' => 15, 'id' => 49), 
    array('x' => 75, 'y' => 16, 'id' => 15) 
); 

    // calculate the distances from each point, to all the other points. 
    foreach($points as &$p) 
    { 
    foreach($points as $p2) 
    { 
     if($p == $p2) 
     continue; 
     $dist = sqrt(pow($p2['x'] - $p['x'], 2) + pow($p2['y'] - $p['y'], 2)); 
     if(!isset($p['distances'])) 
     $p['distances'] = array(); 
     $p['distances'][$p2['id']] = $dist; 
    } 
    } 

    $res = array(); 
    $used = array(); 
    $cnt = -1; 

    // find points close to each other 
    foreach($points as $p) 
    { 
    $cnt++; 
    if(in_array($p['id'], $used)) 
     continue; 
    foreach($points as $p2) 
    { 
     if(($p['id'] == $p2['id']) || in_array($p2['id'], $used)) 
     continue; 
     if($p['distances'][$p2['id']] < 5) // 5 is arbitrary definition of closeness 
     { 
     unset($p2['distances']); 
     $res[$cnt][] = $p2; 
     } 
    } 
    } 
    print_r($res); 

выход из этого заключается в следующем:

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [x] => 52.5 
        [y] => 5 
        [id] => 35 
       ) 

      [1] => Array 
       (
        [x] => 52.5 
        [y] => 7.5 
        [id] => 20 
       ) 

     ) 

    [1] => Array 
     (
      [0] => Array 
       (
        [x] => 48.75 
        [y] => 5 
        [id] => 36 
       ) 

      [1] => Array 
       (
        [x] => 52.5 
        [y] => 7.5 
        [id] => 20 
       ) 

     ) 

    [3] => Array 
     (
      [0] => Array 
       (
        [x] => 48.75 
        [y] => 5 
        [id] => 36 
       ) 

      [1] => Array 
       (
        [x] => 52.5 
        [y] => 5 
        [id] => 35 
       ) 

     ) 

) 

Это не обязательно будет дайте вам все элементы, сгруппированные/сопряженные с элементом CLOSEST, но он будет обеспечивать, чтобы все элементы находились на некотором расстоянии друг от друга.

Смежные вопросы