У меня есть массив, который выглядит так:
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"
"fk_article_id"
"896"
, так что "fk_article_id"
только первый из них:
array(3) { ["fk_article_id"]=> string(3) "896" ["first_name"]=> string(2) "D." ["last_name"]=> string(5) "Bauer" }
Я теперь array_unique()
но я не нашел возможности сказать функции использовать только значения в ID "fk_article_id"
.
Как я могу это сделать?
Редактировать:
Это результат трех столбцов таблицы db через:
$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); }
Быстрый способ использования 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; });
Попробуйте рабочий пример .
Изменить: Кажется, вы не хотите работать с агрегированными результатами. Вот еще две мысли:
Фильтрация в 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); }
Фильтрация в БД
Идея здесь заключается в изменении выполняемого запроса, чтобы повторные идентификаторы статей не отображались в наборе результатов. Это будет зависеть от того, что вы уже используете.
foreach($array as $key => $value){ if(!in_array( $array[$key]['fk_article_id'], $usedValues)){ $usedValues = $array[$key]['fk_article_id']; $cleanArray = $array[$key]; } }
что-то вдоль линий Thoose должно это сделать, я не думаю, что существует предварительная функция массива для этого
Один из способов – перебрать массив, скопировав собственный экземпляр каждого 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; } }
Я бы использовал foreach-loop для перебора массивов и сохранения всех массивов, которые не имеют дубликата _id для нового массива.
$clean = array(); foreach ($arrays as $array) { if (!isset($clean[$array['fk_article_id']]) $clean[$array['fk_article_id']] = $array; }
** получить уникальный ассоциативный массив **, используя этот метод, вы можете легко получить уникальный ассоциативный массив / многомерный массив.
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.