如果值存在,则从数组中删除行

时间:2016-07-10 06:57:17

标签: php

想象我得到了以下数组:

  

阵列(
            [0] =>数组([id] => 1 [代码] =>' 342')
            [1] =>数组([id] => 2 [代码] =>' 765')
            [2] =>数组([id] => 3 [代码] =>' 134')
            [3] =>数组([id] => 1 [代码] =>' 999'))

此处Array [0] [' id']和Array [3] [' id']与[' id']重复。我想删除其中一个(并不重要)。实际上我以为我找到了这个代码的解决方案:

//data
$row = $stmt->fetchALL(PDO::FETCH_ASSOC); 

$ids = array();
for($i = 0;$i < count($row); $i++ )
{
    if (in_array($row[$i]['id'], $ids))
        {
            unset($row[$i]);
            continue;
        }

    $ids[] = $row[$i]['id'];

}

print_r($row);

由于某些原因,它适用于小型数组,但如果我有多个dublicates的很多值,它就会失败。有人建议我缺少什么吗?

2 个答案:

答案 0 :(得分:1)

我认为这可以在没有循环的情况下完成。让我举个例子:

$rows = array (
    array ('id' => 1, 'code' => '342'),
    array ('id' => 2, 'code' => '765'),
    array ('id' => 3, 'code' => '134'),
    array ('id' => 1, 'code' => '342')
);

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

echo '<pre>';
print_r($input);

输出:

 Array
 (
  [0] => Array
    (
        [id] => 1
        [code] => 342
    )

  [1] => Array
    (
        [id] => 2
        [code] => 765
    )

  [2] => Array
    (
        [id] => 3
        [code] => 134
    )

  )

答案 1 :(得分:1)

使用常规foreach循环的简单解决方案:

$rows = [
    ['id' => 1, 'code' => '342'],
    ['id' => 2, 'code' => '765'],
    ['id' => 3, 'code' => '134'],
    ['id' => 1, 'code' => '342']
];

$ids = [];
foreach ($rows as $k => $item) {
    if (in_array($item['id'], $ids)){
         unset($rows[$k]);            
    } else {
         $ids[] = $item['id'];
    }    
}

print_r($rows);