Удалить родительский элемент из многомерного массива, если некоторые элементы массива равны - PullRequest
0 голосов
/ 23 октября 2011

У меня есть массив массивов, как показано ниже.Этот массив содержит 3 массива, и каждый из 3 массивов имеет 18 элементов.Я хочу удалить весь родительский массив (либо [0], [1], [2]), если все 18 элементов в массиве совпадают с 18 элементами в любом из других массивов, за исключением[транзакция_ид] и [дата].Таким образом, оставшиеся 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 ]

1 голос
/ 24 октября 2011

Знаете ли вы, что вы можете сравнивать массивы с ==?

<?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. удалить транзакцию_id, дата с неустановленной() (из оригинала или из тени)
  2. сравнить три результирующих массива друг с другом
  3. повторно вставить транзакцию_id, дату (если вы не затеняли свои исходные данные)

Вы также можете

  1. скопировать массив в тень
  2. удалить идентификатор транзакции и дату
  3. сортировать с помощью ksort
  4. serialize ()чтобы получить строку
  5. sha1 (), чтобы получить хэш массива
  6. сравнить хэши
0 голосов
/ 23 октября 2011

Я не собираюсь писать полное решение здесь, поскольку вы даже не начали с какого-либо кода, но вот как я бы начал:

Я бы порекомендовал написать функцию сравнения для простогомассивы function compare_arr(arr1, arr2, ignore_keys) { ... }, которые вы можете вызвать для каждого подмассива в более конкретной функции сравнения для вашего многомерного массива.

Выполните цикл по парам ключ-значение (foreach?) и проверьте, является ли текущий ключнаходится в массиве ignore_keys, тогда вы можете игнорировать этот элемент, в противном случае вы можете пометить значение как дубликат.Вы можете прервать это сравнение, если значения не совпадают.

Я думаю, что функция фильтра массива не помогает здесь полностью.

...