2012-03-19 3 views
3

У меня есть массив структурированную, как это:Удаление подобных элементов из массива PHP

$arrNames = array(

array('first'=>'John', 'last'=>'Smith', 'id'=>'1'), 
array('first'=>'John', 'last'=>'Smith', 'id'=>'2'), 
array('first'=>'John', 'last'=>'Smith', 'id'=>'3') 

) 

Мне нужно удалить подобные элементы где кулак и фамилия совпадают. Обычно я использую array_unique, но элементы не уникальны, поскольку каждый имеет уникальный идентификатор. Мне все равно, какой идентификатор сохранен. Мне нужен массив, чтобы он выглядел так:

$arrNames = array(

array('first'=>'John', 'last'=>'Smith', 'id'=>'1') // can be any id from the original array 

) 

Есть ли быстрый способ сделать это? Моя первая мысль - использовать что-то вроде пузырьковой сортировки, но мне интересно, есть ли лучший (более быстрый) способ. Результирующий массив добавляется в раскрывающийся список, а повторяющиеся записи путают некоторых пользователей. Я использую идентификатор, чтобы вытащить запись из БД после ее выбора. Поэтому он должен быть включен в массив.

+0

Имеет ли конкретный идентификатор, или вам нужен только один из нескольких возможных идентификаторов? –

+0

'array_map()' возможно, может помочь вам здесь ... –

+0

Конкретный идентификатор не имеет значения. – creatvepro

ответ

6
<?php 

    $arrNames = array(
    array('first'=>'John', 'last'=>'Smith', id=>'1'), 
    array('first'=>'John', 'last'=>'Smith', id=>'2'), 
    array('first'=>'John', 'last'=>'Smith', id=>'3') 
); 

    $arrFound = array(); 
    foreach ($arrNames as $intKey => $arrPerson) { 
    $arrPersonNoId = array(
     'first' => $arrPerson['first'], 
     'last' => $arrPerson['last'] 
    ); 
    if (in_array($arrPersonNoId, $arrFound)) { 
     unset($arrNames[$intKey]); 
    } else { 
     $arrFound[] = $arrPersonNoId; 
    } 
    } 
    unset($arrFound, $intKey, $arrPerson, $arrPersonNoId); 

    print_r($arrNames); 

Это, безусловно, работает, является ли это лучший путь для дебатов ...

Codepad

+1

Написал что-то подобное, когда вы отправили ответ. Я бы связал первое и последнее имя строки, прежде чем вставлять их в '$ arrFound'. 'in_array()' будет более эффективным таким образом. – Tim

+0

@ Тит, что я изначально написал это так, тогда я понял, что он подвержен ошибкам - что, если у вас есть два человека: «Джон Сонсмит» и «Джонсон Смит»? Очевидно, это может быть преодолено оболочкой, но может быть ненадежной, если она исходит от пользовательского ввода ... – DaveRandom

+0

Лучшим решением было бы использовать 'serialize()'. –

1

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

$final = array(); 
foreach ($array as $values) { 
    $final[$values['first'] . $values['last']] = $values; 
} 
$array = array_values($final); 

Последний шаг не является абсолютно необходимым .. только если вы хотите удалить производные ключи.

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