删除重复的数组元素

时间:2015-12-16 09:27:05

标签: php arrays

在php中我有一个名为$source的数组,其中包含

array(5) {
    [0] => array(2) {
               ['id'] => string(18)'619025087225999360'
               ['url'] => 'http//example.com/apple'
           }
    [1] => array(2) {
               ['id'] => string(18)'623368621227847680'
               ['url'] => 'http//example.com/orange'
           }
    [2] => array(2) {
               ['id'] => string(18)'623368621227847680'
               ['url'] => 'http//example.com/blackberry'
           }
}

所以在上面的数组中你可以看到索引号'1'和& '2'具有相同的'id'。这可能是一个巨大的阵列,重复的'id'出现了几次。

我想做的是,如果有相同的id,我只想拿起第一个'id'并丢弃另一个。我尝试使用array_unique()解决这个问题,但无法正确应用它。有人可以帮帮我吗?

5 个答案:

答案 0 :(得分:3)

您好,您可以使用以下解决方案删除重复项。

$foo = [];
foreach ($arr as $key => $value) {
    if (is_array($foo['id']) && !in_array($value['id'], $foo['id'])) {
        $foo['id'][]  = $value['id'];
        $foo['url'][] = $value['url'];
    }

}

最终$foo将为您提供所需的数组

答案 1 :(得分:1)

制作新阵列并复制旧的唯一元素 $source_new = array(); foreach($source as $v) if (!isset($source_new[$v['id']])) $source_new[$v['id']] = $v; $source = array_values($source_new);

答案 2 :(得分:1)

如果您可以控制生成此数组的代码,则可能需要将id用作数组键:

// input values in loop:
$id = '619025087225999360';
$url = 'http//example.com/apple'

if (!array_key_exists($id, $array)) {
    $array[$id] = array(
            'id' => $id,
            'url' => $url,
        );
}

这也可以防止重复循环遍历所有项目。特别是如果阵列很大,它会更快,更有效。

如果无法做到这一点,我建议使用此代码有效删除重复项:

$usedIds = array();
foreach ($array as $key => $value) {
    if (array_key_exists($value['id'], $usedIds)) {
        unset($array[$key]);
    }
    $usedIds[$value['id']] = true;
}

优点:

  • 不会创建数组的副本
  • 仅对所有项目进行一次循环
  • 使用hashmap检查现有ID(快速访问)

答案 3 :(得分:0)

更清洁,更简单:

从各种重叠查询中删除重复结果。

$input = array_map("unserialize", array_unique(array_map("serialize", $input)));

答案 4 :(得分:0)

嘿,我已经为你创建了一个代码。它非常简单,没有额外的方法,它完成了工作。

<?php

$source = array(
    array(
        'id' => '619025087225999360',
        'url' => 'http//example.com/apple'
    ),
    array(
        'id' => '623368621227847680',
        'url' => 'http//example.com/orange'
    ),
    array(
        'id' => '623368621227847680',
        'url' => 'http//example.com/blackberry'
    )
);

$newArray = array();
foreach($source as $data){

    $flag = TRUE;
    foreach($newArray as $newData){
        if($newData['id']==$data['id']){
            $flag = FALSE;
        }
    }
    if($flag){
        $newArray []= $data;
    }
}
echo '<pre>';
echo '<h1>Previous Array</h1><hr>';
print_r($source);
echo '<h1>New Array</h1><hr>';
print_r($newArray);
?>