JasperM
JasperM

Reputation: 57

list duplicates in PHP Array

i have a new problem and my mind is burning, i have an array in php

$test = array();
    Array
    (
        [0] => Array
            (
                [account] => 14319896
                [value] => 725.57
                [id] => 280
            )

        [1] => Array
            (
                [account] => 163157
                [value] => -723.57
                [id] => 283
            )

        [2] => Array
            (
                [account] => 163157
                [value] => 723.57
                [id] => 284
            )

        [3] => Array
            (
                [account] => 161817
                [value] => -723.57
                [id] => 285
            )

    )

i need the accounts, they are more than one in this array, in this example i need $test[1][id] and $test[2][id]

have you an idea? i have no idea more at this time.

Thanks for your help.

Upvotes: 1

Views: 821

Answers (2)

knittl
knittl

Reputation: 265161

Use the account number as key in a new array, count each entry and then take the items with a count > 1

$dupes = array();
foreach($array as $account) {
  ++$dupes[$account['account']];
}

$dupes = array_filter($dupes, function($count) { return $count > 1; });

Editing to answer the comments below the question …

If you want the IDs (or keys) of the duplicates, do not store the count directly, but use another array instead.

$dupes = array();
foreach($array as $key => $account) {
  if(!array_key_exists($account, $dupes))
    $dupes[$account['account']] = array();
  $dupes[$account['account']][] = $account['id']; // or: = $key
}

$dupes = array_filter($dupes, function($ids) { return count($ids) > 1; });

Upvotes: 4

artragis
artragis

Reputation: 3713

You should change your architecture to have a associative array where keys are account number organized like that :

 Array
(
    [14319896] => Array
        (
            [0]=>Array(
                [value] => 725.57
                [id] => 280
            )
        )

    [163157] => Array
        (
            [0]=>Array(
                [value] => -723.57
                [id] => 283
             )
            [1]=>Array(
                [value] => 723.57
                [id] => 284
            )
        )

    [161817] => Array
        (
            [0]=>Array(
                [value] => -723.57
                [id] => 285
            )
        )

)


$dupes = array();
foreach($array as $key => $account) {

  $dupes[$account['account']][] = array($account['id'],$account['value']); 
}

Whith that architecture you can get everything you want thanks to array_filter :

$dups = array_filter($dupes, function($account){ return count($account)>1;});

Upvotes: 0

Related Questions