我有一个二维数组,其中包含可能多次表示用户的行。我需要删除用户数据的重复示例,但不希望在此过程中丢失任何有意义的数据。Flying Tour
列中具有非空值的行应优先于同一列中具有空值的行。
样本数据:
$data = [
[
'Access ID' => 12345,
'Registration Date' => '2018-02-27',
'First Name' => 'Damian',
'Last Name' => 'Martin',
'Flying Tour' => ''
],
[
'Access ID' => 12345,
'Registration Date' => '2018-02-27',
'First Name' => 'Damian',
'Last Name' => 'Martin',
'Flying Tour' => 'Yes going'
],
[
'Access ID' => 789456,
'Registration Date' => '2018-03-27',
'First Name' => 'Ricky',
'Last Name' => 'Smith',
'Flying Tour' => ''
],
[
'Access ID' => 789456,
'Registration Date' => '2018-03-27',
'First Name' => 'Ricky',
'Last Name' => 'Smith',
'Flying Tour' => 'Two way going',
],
[
'Access ID' => 987654,
'Registration Date' => '2018-04-27',
'First Name' => 'Darron',
'Last Name' => 'Butt',
'Flying Tour' => ''
]
];
我的代码:
$results = [];
foreach($data as $input){
$isDuplicate = false;
foreach($results as $result){
if(
strtolower($input['First Name'])===strtolower($result['First Name']) &&
strtolower($input['Last Name'])===strtolower($result['Last Name']) &&
strtolower($input['Registration ID'])===strtolower($result['Registration ID']) &&
strtolower(!empty($input['Flying Tour']))
){
//a duplicate was found in results
$isDuplicate = true;
break;
}
}
//if no duplicate was found
if(!$isDuplicate) $results[]=$input;
}
预期结果:
Array
(
[0] => Array
(
[Access ID] => 12345
[Registration Date] => 2018-02-27
[First Name] => Damian
[Last Name] => Martin
[Flying Tour] => Yes going
)
[1] => Array
(
[Access ID] => 789456
[Registration Date] => 2018-03-27
[First Name] => Ricky
[Last Name] => Smith
[Flying Tour] => Two way going
)
[2] => Array
(
[Access ID] => 987654
[Registration Date] => 2018-04-27
[First Name] => Darron
[Last Name] => Butt
[Flying Tour] =>
)
)
进行了一些更改,请参见
7条答案
按热度按时间kmpatx3s1#
使用
foreach()
和数组键检查重复项:样本输出:https://3v4l.org/2KcSN
93ze6v8z2#
使用
foreach
迭代$data
。通过$duplicates
变量存储重复信息,并使用它删除重复值。备选案文:
ffdz8vbo3#
从应该是唯一的值组成键。
如果
$results
中不存在来自每个循环数组的组合键,则将其包含在结果中。此外,如果组合键存在且
Flying Tour
值为空,则替换为新数组。wfsdck304#
这里的要点是,在第一次运行时,
$results
仍然是空的,因此,可以设置$isDuplicate = true
的整个逻辑永远不会在第一个示例中运行。这意味着对于第一个记录,
$isDuplicate = false
,因此它将始终被添加。此外,X1 M3 N1 X有点奇怪...在我看来应该给予一个错误(即使它没有...)
你应该把
!empty($input['Flying Tour'])
移到for循环之外,因为它不需要新数组中的当前值来进行检查,这样就可以解决问题。如果你想学习和改进你的代码,看看array_filter它是为这个目的:滤波阵列结果。
--编辑
yqyhoc1h5#
要按唯一用户分组,您只需引用其唯一访问编号。使用该值作为结果数组中的分组第一级关键字。在迭代时,如果访问ID没有保存的行,则保存该行。如果该行存在,但
Flying Tour
值为空,则将当前行保存在其位置。完成迭代后,可以通过调用array_values()
来删除关联的第一级键。代码:(Demo)
xwbd5t1u6#
4smxwvx57#