我有一个像这样结构的数组:
$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中取回记录。因此,它必须包含在数组中。
答案 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);
这绝对有效,无论是最好的方式还有争议......
答案 1 :(得分:1)
我知道没有快速简便的方法,但这是一种相对简单的方法,假设“类似元素”的ID无关紧要(即您只需要ID周期)。
$final = array();
foreach ($array as $values) {
$final[$values['first'] . $values['last']] = $values;
}
$array = array_values($final);
最后一步并非绝对必要..仅当您要删除派生密钥时才会这样做。