views:

102

answers:

4

Hi there!

I have an array that looks just like that:

array(3) { ["fk_article_id"]=> string(1) "4" ["first_name"]=> string(6) "Ulrike" ["last_name"]=> string(10) "Grasberger" }

array(3) { ["fk_article_id"]=> string(1) "9" ["first_name"]=> string(5) "Frank" ["last_name"]=> string(9) "Neubacher" }

array(3) { ["fk_article_id"]=> string(3) "896" ["first_name"]=> string(2) "D." ["last_name"]=> string(5) "Bauer" }

array(3) { ["fk_article_id"]=> string(3) "896" ["first_name"]=> string(2) "S." ["last_name"]=> string(6) "Anders" }

array(3) { ["fk_article_id"]=> string(3) "896" ["first_name"]=> string(2) "M." ["last_name"]=> string(6) "Tsokos" }

array(3) { ["fk_article_id"]=> string(3) "897" ["first_name"]=> string(8) "Reinhard" ["last_name"]=> string(8) "Scholzen" }

Now what I want to do is to get rid of the duplicate "fk_article_id" values "896", so that only the first of those is left:

array(3) { ["fk_article_id"]=> string(3) "896" ["first_name"]=> string(2) "D." ["last_name"]=> string(5) "Bauer" }

I now array_unique() but I haven't found a possibility to tell the function to only use the values in the "fk_article_id" ID.

How can I do this?

Edit:

It's the output of a three column db table via:

$authors_result = pg_query($query_authors) or trigger_error("An error occurred.<br/>" . mysql_error() . "<br />SQL-Statements: {$searchSQL}");

while ($row = pg_fetch_assoc($authors_result)) {
var_dump($row);
}
+1  A: 
foreach($array as $key => $value){
    if(!in_array( $array[$key]['fk_article_id'], $usedValues)){
        $usedValues = $array[$key]['fk_article_id'];
        $cleanArray = $array[$key];
    }
}

something along thoose lines should do it, i don't think there is an pre existing array funciton for that

Hannes
A: 

I would use a foreach-loop to iterate over the arrays and save all arrays that dont have a duplicate _id to a new array.

$clean = array();
foreach ($arrays as $array) {
  if (!isset($clean[$array['fk_article_id']])
    $clean[$array['fk_article_id']] = $array;
}
tilman
A: 

One way would be to iterate over the array, copying ownly the first instance of each fk_article_id in a new array.

<?php

$your_unique_array = array();
foreach ($your_original_array as $v) {
  if (!isset($your_unique_array[$v['fk_article_id']) {
      $your_unique_array[$v['fk_article_id'] = $v;
  }
}
brian_d
A: 

A quick way using array_reduce would look like:

$unique = array_reduce($subject, function($final, $article){
    static $seen = array();
    if ( ! array_key_exists($article['fk_article_id'], $seen)) {
        $seen[$article['fk_article_id']] = NULL;
        $final[] = $article;
    }
    return $final;
});

Try a working example.


Edit: Seems you don't want to work with the aggregated results. Here are two other thoughts:

Filtering in PHP

$seen = array();
while ($row = pg_fetch_assoc($authors_result)) {
    // Skip this row if we have already seen its article id
    if (array_key_exists($row['fk_article_id'], $seen)) {
        continue;
    }
    // Note that we have seen this article
    $seen[$row['fk_article_id']] = NULL;
    // Do whatever with your row
    var_dump($row);
}

Filtering in the DB

The idea here is to change the query being executed so that the repeated article ids do not appear in the result set. How this is done will depend on the query that you're already using.

salathe
Looks pretty good, thanks! Would it be possible to use one array instead of a multi-dimensional for $subject?
flhe
@flhe see my edit
salathe
You're absolutely right of course :) But I don't know with which pg_fetch_* function I can get exactly the output to fit your $subject... pg_fetch_all doesn't really work. I'm a beginner, I'm sorry.. :/
flhe
ok finally it worked, thanks man!
flhe