2016-12-30 50 views
-1

我想只在多维数组中获得重复的记录。 我的数组是这样的:只返回多维数组中的重复值php

"items": [ 
{ 
    "id": "1", 
    "father_name": "YYY", 
    "surname": "XXX", 
    "name": "abc", 
}, 
{ 
    "id": "1", 
    "father_name": "YYY", 
    "surname": "XXX", 
    "name": "abc", 
}, 
{ 
    "id": "2", 
    "father_name": "ZZZ", 
    "surname": "UUU", 
    "name": "abc", 
}, 
] 

我想得到这样

"items": [ 
    { 
     "id": "1", 
     "father_name": "YYY", 
     "surname": "XXX", 
     "name": "abc", 
    }, 
] 

我怎样才能得到它的结果吗?请帮助我我卡在这里。

我已经尝试了很多东西,但一切工作在一维阵列

在此先感谢!

+0

您使用的是哪个版本的PHP? –

+2

呈现的数组看起来不像PHP输出,它来自JSON字符串? – RomanPerekhrest

+0

你想考虑哪些键值来获得重复的数组结果?所有的钥匙或任何特定的钥匙? –

回答

1

给定的数据是一个json字符串。

假设为您的阵列结构中的相同尝试:

$arr = array("items"=>array(
    "id"=> "1", 
    "father_name"=> "YYY", 
    "surname"=> "XXX", 
    "name"=> "abc", 
), 
array(
    "id"=> "1", 
    "father_name"=> "YYY", 
    "surname"=> "XXX", 
    "name"=> "abc", 
), 
array(
    "id"=> "2", 
    "father_name"=> "ZZZ", 
    "surname"=> "UUU", 
    "name"=> "abc", 
) 
); 

$withoutDuplicates = array_unique($arr, SORT_REGULAR); 
$duplicates = array_diff_assoc($arr, $withoutDuplicates); 
echo "<pre>"; 
print_r($duplicates); 

OUTPUT:

阵列 ( [0] =>数组 ( [ID] => 1 [ father_name] => YYY [surname] => XXX [name] => abc ))

+0

注意:Array 24到字符串转换 –

+0

@AndrewLarsen对不起,但我没有得到任何。 –

+0

你运行什么php版本?我在php 5.6.25上测试它时得到了这个通知 –

0
<?php 

$arr = array(
    'items' => array(
     0 => array(
      'id' => '1', 
      'father_name' => 'YYY', 
      'surname' => 'XXX', 
      'name' => 'abc' 
     ), 
     1 => array(
      'id' => '1', 
      'father_name' => 'YYY', 
      'surname' => 'XXX', 
      'name' => 'abc' 
     ), 
     2 => array(
      'id' => '2', 
      'father_name' => 'ZZZ', 
      'surname' => 'UUU', 
      'name' => 'abc' 
     ) 
    ) 
); 

$result = array(); 
for ($i = 0; $i < count($arr['items'])-1; $i++) { 
    for ($x = $i+1; $x < count($arr['items']); $x++) { 
     if ($arr['items'][$i] !== $arr['items'][$x] || in_array($arr['items'][$i], $result)) 
      continue; 

     array_push($result, $arr['items'][$i]); 
    } 
} 

print_r($result); 

?> 

假设你正在使用多维的php数组,它的一种方法就是使用它。

0

你可以做这样的事情:

foreach($items as $key => $item) 
{ 
    unset($items[$key]); 
    if(array_search($item['id'], array_column($items, 'id_or_another_key'))) 
    { 
     $result[] = $item; 
    } 
} 

这段代码的意义是下一个:

  1. 你应该去通过初始数组中的周期
  2. 从删除当前项目阵列
  3. 通过'id'值或其他元素之间的其他键搜索相似项目
  4. 如果找到该项目,则将其放到含有重复项目的结果数组中。
2

作为替代其他的答案,你也可以这样做:

$duplicates = []; 

while ($a = array_shift($array)) { 
    if (in_array($a, $array) && !in_array($a, $duplicates)) { 
     $duplicates[] = $a; 
    } 
} 

希望这有助于!

+0

迄今为止的最佳解决方案。 –

+0

@AndrewLarsen谢谢! :) –

0
<?php 
/** 
* @param $data array 
* 
* @return array 
*/ 
function getDuplicatesOnly(array $data): array 
{ 
    $result = [ 
      'items' => [ 
       ], 
     ]; 
    foreach ($data as $key => $datum) { 
     $itemId = $datum['id']; 
     unset($data[$key]); 
     $columns = array_column($data, 'id'); 
     if(in_array($itemId, $columns)) { 
      $result['items'][] = $datum; 
     } 
    } 

    return $result; 
} 

$testData = [ 
     'input' => [ 
      'items' => [ 
       [ 
        'id' => '1', 
        'father_name' => 'YYY', 
        'surname' => 'XXX', 
        'name' => 'abc' 
       ], 
       [ 
        'id' => '1', 
        'father_name' => 'YYY', 
        'surname' => 'XXX', 
        'name' => 'abc' 
       ], 
       [ 
        'id' => '2', 
        'father_name' => 'ZZZ', 
        'surname' => 'UUU', 
        'name' => 'abc' 
       ] 
      ] 
     ], 
     'output' => [ 
       'items' => [ 
         [ 
          'id' => '1', 
          'father_name' => 'YYY', 
          'surname' => 'XXX', 
          'name' => 'abc' 
         ] 
        ], 
      ], 
    ]; 

$output = getDuplicatesOnly($testData['input']['items']); 
assert($testData['output'] == $output, "Failed asserting data."); 

可以测试here