Поиск уникальных значений в двумерном ассоциативном массиве

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

/** возвращает массив уникальных значений в двумерном ассоциативном массиве

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 $array - массив
 $row_element - название поля, по которому искать уникальные значения
 */
 function remove_dups($array, $row_element) {
     $new_array[0] = $array[0];
     foreach ($array as $current) {
         $add_flag = 1;
         foreach ($new_array as $tmp) {
             if ($current[$row_element]==$tmp[$row_element]) {
                 $add_flag = 0; break;
             }
         }
         if ($add_flag) $new_array[] = $current;
     }
     return $new_array;
 }

Покажу на примерах, как это работает.
Имеем массив:

1
2
3
4
$array[0] = array('city'=>'Москва','street'=>'Орджоникидзе');
$array[1] = array('city'=>'Самара','street'=>'Ленина');
$array[2] = array('city'=>'Москва','street'=>'Мира');
$array[3] = array('city'=>'Питер','street'=>'Ленина');

Найдем в нем уникальные записи с ключом 'city'

1
$array2 = remove_dups($array, 'city');

Результат выполнения

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
array(3) {
  [0]=>
    array(2) {
      ["city"]=> string(6) "Москва"
      ["street"]=> string(12) "Орджоникидзе"
    }
  [1]=>
    array(2) {
      ["city"]=> string(6) "Самара"
      ["street"]=> string(6) "Ленина"
    }
  [2]=>
    array(2) {
      ["city"]=> string(5) "Питер"
      ["street"]=> string(6) "Ленина"
    }
}

Или же отсортируем по второму ключу ассоциативного массива 'street' и получим такой результат

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
array(3) {
  [0]=>
    array(2) {
      ["city"]=> string(6) "Москва"
      ["street"]=> string(12) "Орджоникидзе"
    }
  [1]=>
    array(2) {
      ["city"]=> string(6) "Самара"
      ["street"]=> string(6) "Ленина"
    }
  [2]=>
    array(2) {
      ["city"]=> string(6) "Москва"
      ["street"]=> string(4) "Мира"
    }
}

Если у Вас не ассоциативные, а обычные двумерные массивы, то вместо названия ключа нужно будет писать его номер.

В свое время это решение я нашел на php.net.

Метки: , ,

Пятница, января 22, 2010 php

Комментировать

При копировании материалов указывайте ссылку на http://kuaa.ru