2015-06-10 4 views
0

У меня есть массив, содержащий несколько объектов.Как сравнить значения объектов внутри массива?

$products = [ 
      {"id":"1","random":"sadasd","mergethis":"Ding"}, 
      {"id":"2","random":"assdfsadf","mergethis":"Ding"}, 
      {"id":"2","random":"assdfsadf","mergethis":"Flop"}, 
      {"id":"2","random":"assdfsadf","mergethis":"Bips"}, 
      {"id":"3","random":"sdfss","mergethis":"Flung"}, 
      {"id":"3","random":"sdfss","mergethis":"Rorg"}, 
      {"id":"4","random":"asdasdddaf","mergethis":"Shwung"} 
      ] 

Я пытаюсь итерацией корыта этого массива и когда id является Allready в массиве, я хочу, чтобы добавить значение mergethis с первым ударом, который имеет то же id, разделенный с запятой, а затем удалите объект из массива.

Так что мой ожидаемый результат стал бы:

[ 
{"id":"1","random":"sadasd","mergethis":"Ding"}, 
{"id":"2","random":"assdfsadf","mergethis":"Ding,Flop,Bips"}, 
{"id":"3","random":"sdfss","mergethis":"Flung,Rorg"}, 
{"id":"4","random":"asdasdddaf","mergethis":"Shwung"} 
] 

Я пытаюсь итерация корыта $products и сравнить значения, но я застрял в сравнении значения для подзначения массива в смене на весь массив

foreach($products as $key => $value){ 
    if (in_array($value->id, $products)) { 
     //Delete this item and add product_category comma sepereated to first item 
     //unset($products[$key]); 
    } 
} 

Это, очевидно, не работает, потому что он сравнивает элемент для всего массива в смене до значения юга id от элемента массива.

Как мне получить ожидаемый результат?

Должен ли я создать новый массив, заполненный ключами, и значения id каждого элемента массива и перебрать его? Или есть более простой способ сравнить значения объектов внутри массива друг с другом?

+1

Я думаю, вам нужно создать новый массив и заполнить его во время цикла foreach. – djoosi

ответ

2

Подсказка: Используйте ассоциативный массив с id, как ключ и весь продукт в качестве значения:

$results = array(); 
foreach ($products as $prod){ 
    if (array_key_exists($prod['id'], $results)){ 
     $results[$prod['id']]['mergethis'] .= ',' . $prod['mergethis']; 
    } else { 
     $results[$prod['id']] = $prod; 
    } 
} 
+0

Это добавляет ключ элемента к mergethis вместо значения mergethis. Второй '$ prod ['id'] ['mergethis']' должен быть '$ prod ['mergethis']'. Также не хватает некоторых закрывающих ';' и ')' в выражении if. Но кроме того, хороший ответ =). – timo

+1

Спасибо, я обновил свой ответ –

0

Вы в основном ищете реализации PHP в pluck. Посмотрите на this gist for a PHP version.

$ids_array = array_pluck("id", $products); // get just he id values 
$ids_array = array_unique($ids_array); // remove duplicates 
foreach($products as $key => $value){ 
    if (in_array($value->id, $ids_array)) { 
     //Delete this item and add product_category comma sepereated to first item 
     //unset($products[$key]); 
    } 
} 
function array_pluck ($toPluck, $arr) { 
    return array_map(function ($item) use ($toPluck) { 
     return $item[$toPluck]; 
    }, $arr); 
} 
1
$result = []; 
foreach ($products as $value) { 
    if (!isset($result[$value['id']])) { 
     $value['mergethis'] = [$value['mergethis']]; 
     $result[$value['id']] = $value; 
    } else { 
     $result[$value['id']]['mergethis'][] = $value['mergethis']; 
    } 
} 

Это кажется наиболее разумным. Если вам нужны массивы, соединенные запятыми в одну строку:

foreach ($result as &$value) { 
    $value['mergethis'] = join(',', $value['mergethis']; 
} 
Смежные вопросы