2010-09-22 1 views
2

У меня есть массив, который выглядит так же, как это:Как удалить повторяющиеся значения из ассоциативного массива на основе определенного значения?

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" } 

Теперь то, что я хочу сделать, это избавиться от дубликатов "fk_article_id" значений "896", так что только первый из них осталось:

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

Я сейчас array_unique(), но я не нашел возможности сообщить функции использовать значения только в "fk_article_id" ID.

Как я могу это сделать?

Edit:

Это выход из таблицы БД в три колонки с помощью:

$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); 
} 
+0

Это похоже на несколько массивов ... у вас есть массив массивов? –

+0

Можете ли вы отобразить это как код, а не как вывод –

+0

Это результат трех столбцов таблицы db, я отредактировал главный пост. – flhe

ответ

3

Быстрый способ использования array_reduce будет выглядеть так:

$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; 
}); 

Попробуйте a working example.


Редактировать: Кажется, вы не хотите работать с агрегированными результатами. Вот две другие мысли:

фильтрации в 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); 
} 

Фильтрация в БД

Идея заключается в том, чтобы изменить запрос выполняется таким образом, что повторяющиеся идентификаторы статьи не появляются в результирующем наборе. Это будет зависеть от того, что вы уже используете.

+0

Выглядит неплохо, спасибо! Можно ли использовать один массив вместо многомерного объекта $ subject? – flhe

+0

@flhe see my edit – salathe

+0

Вы абсолютно правы, конечно :) Но я не знаю, с какой функцией pg_fetch_ * я могу получить именно то, что подходит вашему объекту $ ... pg_fetch_all на самом деле не работает. Я новичок, извините ../ – flhe

1
foreach($array as $key => $value){ 
    if(!in_array($array[$key]['fk_article_id'], $usedValues)){ 
     $usedValues = $array[$key]['fk_article_id']; 
     $cleanArray = $array[$key]; 
    } 
} 

что-то вдоль thoose линии должны делать это, я не думаю, что есть заранее существующий массив funciton для этого

0

Я бы использовал цикл foreach для перебора массивов и сохранения всех массивов, которые не имеют дубликата _id для нового массива.

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

Один из способов будет перебрать массив, копирование ownly первый экземпляр каждого fk_article_id в новом массиве.

<?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; 
    } 
} 
0

** получить уникальный ассоциативный массив ** , используя этот метод, вы можете легко получить уникальный ассоциативный массив/многомерный массив.

array:6 [▼ 
    0 => array:1 [▼ 
     2 => "Airtel DTH" 
      ] 
     1 => array:1 [▼ 
     2 => "Airtel DTH" 
      ] 
     2 => array:1 [▼ 
     2 => "Airtel DTH" 
      ] 
     3 => array:1 [▼ 
     3 => "NeuSoft PVT LMT" 
     ] 
     4 => array:1 [▼ 
     3 => "NeuSoft PVT LMT" 
     ] 
     5 => array:1 [▼ 
     3 => "NeuSoft PVT LMT" 
     ] 
     ] 


    function assoc_Array_unique($array) 
      { 
       $result = array_map("unserialize", array_unique(array_map("serialize", $array))); 

       foreach ($result as $key => $value) 
       { 
        if (is_array($value)) 
        { 
         $result[$key] = assoc_Array_unique($value); 
        } 
       } 
       return $result; 
      } 
    $arr_Company= assoc_Array_unique($arr_Company); // get Unique Array 
       $arr_Company = array_values($arr_Company); Rearrange Index of Array. 
Смежные вопросы