如果数组的某些元素相等,则从多维数组中删除父元素

时间:2011-10-23 19:36:48

标签: php multidimensional-array duplicate-removal

我有一个数组数组,如下所示。该数组包含3个数组,3个数组中的每一个都有18个元素。我想删除整个父数组([0],[1],[2]),如果数组中的所有18个元素与任何其他数组中的18个元素相同,除了[transaction_id]和[date]。因此剩余的16个元素必须相同才能使数组被认为是重复的并且从数组中删除父数组。

任何帮助将不胜感激。我搜索了这个网站,但找不到关于这个特定问题的问题。

[0] => Array
    (
        [transaction_id] => 3474
        [date] => 2011-09-20
        [location] => Kansas City
        [year] => 2005
        [year_diff] => 0
        [make] => Ford
        [make_id] => 19
        [model] => F150 Sc Cab
        [model_id] => 478
        [subseries] => Lariat
        [color] => Dk Grn
        [doors] => X
        [cylinders] => 8
        [radio] => CD
        [odometer] => 78029
        [odometer_difference] => -4971
        [odometer_difference_abs] => 4971
        [price] => 9400
    )

[1] => Array
    (
        [transaction_id] => 1843
        [date] => 2011-09-21
        [location] => Kansas City
        [year] => 2005
        [year_diff] => 0
        [make] => Ford
        [make_id] => 19
        [model] => F150 Sc Cab
        [model_id] => 478
        [subseries] => Lariat
        [color] => Dk Grn
        [doors] => X
        [cylinders] => 8
        [radio] => CD
        [odometer] => 78029
        [odometer_difference] => -4971
        [odometer_difference_abs] => 4971
        [price] => 9400
    )

[2] => Array
    (
        [transaction_id] => 7778
        [date] => 2011-10-05
        [location] => Kansas City
        [year] => 2005
        [year_diff] => 0
        [make] => Ford
        [make_id] => 19
        [model] => F150 Crew Cab
        [model_id] => 19
        [subseries] => XLT
        [color] => Blue
        [doors] => C
        [cylinders] => 8
        [radio] => CD
        [odometer] => 89887
        [odometer_difference] => 6887
        [odometer_difference_abs] => 6887
        [price] => 15100
    )

2 个答案:

答案 0 :(得分:1)

您知道可以将数组与==进行比较吗?

<?php

$a = array( 'a' => 'alpha', 'b' => 'bravo' );
$b = array( 'a' => 'alpha', 'b' => 'bravo' );
$c = array( 'a' => 'alpha', 'c' => 'charlie' );
$d = array( 'c' => 'charlie', 'a' => 'alpha' );

var_dump(
    $a == $b, // true
    $a === $b, // true
    $a != $c, // true (different keys/values)
    $c == $d, // true
    $c !== $d // true (no identity! - different order of keys)
);

考虑到这一点,

应该很简单
  1. 删除transaction_id,使用unset()(来自原始或阴影)的日期
  2. 将三个结果数组相互比较
  3. 重新插入transaction_id,日期(如果您没有隐藏原始数据)
  4. 你也可以

    1. 将数组复制到阴影
    2. 删除transaction_id和日期
    3. 使用kso​​rt排序
    4. serialize()获取字符串
    5. sha1()获取数组的哈希值
    6. 比较哈希

答案 1 :(得分:0)

我不打算在这里编写整个解决方案,因为你还没有开始使用任何代码,但这是我将如何开始:

我建议为简单数组function compare_arr(arr1, arr2, ignore_keys) { ... }编写一个比较函数,您可以在多维数组的更具体的比较函数中为每个子数组调用它。

循环键值对(foreach?)并检查当前键是否在数组ignore_keys中,然后您可以忽略此元素,否则您可以将值标记为重复。 如果值不匹配,您可以中止此比较。

我认为数组滤波器功能在这里没有任何帮助。