从PHP数组中删除类似元素
我有一个如下结构的数组:从PHP数组中删除类似元素,php,Php,我有一个如下结构的数组: $arrNames = array( array('first'=>'John', 'last'=>'Smith', 'id'=>'1'), array('first'=>'John', 'last'=>'Smith', 'id'=>'2'), array('first'=>'John', 'last'=>'Smith', 'id'=>'3') ) $arrNames = array( array('firs
$arrNames = array(
array('first'=>'John', 'last'=>'Smith', 'id'=>'1'),
array('first'=>'John', 'last'=>'Smith', 'id'=>'2'),
array('first'=>'John', 'last'=>'Smith', 'id'=>'3')
)
$arrNames = array(
array('first'=>'John', 'last'=>'Smith', 'id'=>'1') // can be any id from the original array
)
我需要删除拳头和姓氏相同的类似元素。通常,我会使用array_unique,但元素并不完全唯一,因为每个元素都有一个唯一的id。我不在乎保留哪个id。我只需要阵列看起来像这样:
$arrNames = array(
array('first'=>'John', 'last'=>'Smith', 'id'=>'1'),
array('first'=>'John', 'last'=>'Smith', 'id'=>'2'),
array('first'=>'John', 'last'=>'Smith', 'id'=>'3')
)
$arrNames = array(
array('first'=>'John', 'last'=>'Smith', 'id'=>'1') // can be any id from the original array
)
有没有一个快速的方法来实现这一点?我的第一个想法是使用气泡排序,但我想知道是否有更好(更快)的方法。结果数组被添加到下拉列表框中,重复的条目会让一些用户感到困惑。我正在使用ID在选中记录后将其从数据库中拉回来。因此,它必须包含在数组中。
据我所知,没有快速简便的方法,但这里有一种相对简单的方法,假设“相似元素”的ID不重要(即,您只需要一个ID周期)
<?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);
最后一步并非绝对必要。。只有当您想删除派生密钥时。特定ID重要吗,还是您只需要几个可能的ID中的一个?array\u map()
可能会在这里帮助您…特定ID不重要。我想它已经在这里了:当您发布答案时,正在写这样的东西。在将名字和姓氏插入$arrFound
之前,我会将它们压缩成一个字符串in_array()
那样会更有效。@Tim我最初是这样写的,后来我意识到它很容易出错-如果你有两个人,John Sonsmith
和Johnson Smith
?显然,使用大小写可以克服这一问题,但如果它来自用户输入,则可能不可靠……更好的解决方案是使用serialize()
。它已经在stackoverflow中:@Truth这是一个好主意,因为它可以很容易地不区分大小写