从PHP数组中删除类似的元素

时间:2012-03-19 17:15:27

标签: 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,但元素并不完全唯一,因为每个元素都有唯一的id。我不关心保留哪个ID。我只需要这个数组看起来像这样:

$arrNames = array(

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

)

有没有快速的方法来实现这一目标?我的第一个想法是使用像冒泡一样的东西,但我想知道是否有更好(更快)的方式。生成的数组将添加到下拉列表框中,并且重复的条目会使某些用户感到困惑。选中后,我正在使用ID从DB中取回记录。因此,它必须包含在数组中。

2 个答案:

答案 0 :(得分: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 :(得分:1)

我知道没有快速简便的方法,但这是一种相对简单的方法,假设“类似元素”的ID无关紧要(即您只需要ID周期)。

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

最后一步并非绝对必要..仅当您要删除派生密钥时才会这样做。