объединение дубликатов из массива объектов за исключением одного значения ... php / mysql - PullRequest
0 голосов
/ 03 апреля 2011

Вот упрощенная версия моих данных. Это результат запроса с использованием JOIN, который выдает такие данные:

id     name         picture
1      Foo          picture_001.jpg
1      Foo          picture_002.jpg
2      Bar          another_image.jpg
3      Baz          some_picture_001.jpg
3      Baz          some_picture_002.jpg

Вывод представляет собой массив объектов, который выглядит следующим образом (свернут, чтобы просто показать данные ID 1):

print_r($my_data); // produces:

Array
(
    [0] => stdClass Object
    (
        [id] => 1
        [name] => Foo
        [picture] = picture_001.jpg
    )

    [1] => stdClass Object
    (
        [id] => 1
        [name] => Foo
        [picture] = picture_002.jpg
    )
)

Этот массив может содержать еще несколько объектов с разными идентификаторами, именами и изображениями.

Я пытаюсь перебрать каждый объект и вывести данные. Это я делаю так:

foreach($object as $item)
{
    echo $item->id;
}

Это работает, но, как и ожидалось, выдает дублированные данные в результате объединения.

Я искал решение, но не могу понять, как предотвратить это дублирование.

В моем дампе данных выше, я бы хотел, чтобы вывод был:

ID 1
Name: Foo
Pictures in Foo:
  picture_001.jpg
  picture_002.jpg

ID 2
Name:Bar
Pictures in Bar
  another_image.jpg

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

Я могу предоставить SQL и, возможно, изменить способ вывода данных, но я хотел бы сначала увидеть методологию, лежащую в основе этого, и как это сделать.

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 03 апреля 2011
$my_parsed_data = array();
foreach($mydata as $data){
  $my_parsed_data[$data->id]["id"] = $data->id;
  $my_parsed_data[$data->id]["name"] = $data->name;
  $my_parsed_data[$data->id]["photos"][] = $data->picture;
}

это решение даст вам простой массив информации в нужном вам формате ... если вы хотите вместо этого массив объектов, вам нужно будет создать класс, который эмулирует этот код, что-то вроде:

class ArrayList{
   private elements = array();

   public function addElement(){
      //some magic here =)
   }

}
1 голос
/ 03 апреля 2011

GROUP_CONCAT должно быть вашим решением:

SELECT id, name, 
       GROUP_CONCAT( picture ORDER BY picture SEPARATOR '<br/'> ) as pictures
FROM your_table
GROUP BY id, name

это потребует некоторой игры с ним, чтобы получить ваше форматирование, однако это может быть способ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...