Объединить массивы с одинаковым значением для ключа – PHP

У меня многомерный массив

Array( [0] => Array ( [category_id] => 1 [question_id] => 1 [option_id] => 2 [title] => Do you wear glasses? [answer] => no ) [1] => Array ( [category_id] => 1 [question_id] => 2 [option_id] => 3 [title] => Your hobbies ? [answer] => movies ) [2] => Array ( [category_id] => 1 [question_id] => 4 [option_id] => 8 [title] => what is your status? [answer] => single ) [3] => Array ( [category_id] => 1 [question_id] => 2 [option_id] => 1 [title] => Your hobbies ? [answer] => travel ) ) 

В котором 2-й и 4-й массивы содержат один и тот же вопрос (одинаковый идентификатор категории и один и тот же идентификатор вопроса). Я хочу объединить массивы с одинаковым идентификатором категории и идентификатором вопроса.

Я ожидаю, что это

 Array( [0] => Array ( [category_id] => 1 [question_id] => 1 [option_id] => 2 [title] => Do you wear glasses? [answer] => no ) [1] => Array ( [category_id] => 1 [question_id] => 2 [option_id] => 3 [title] => Your hobbies ? [answer] => movies,travel ) [2] => Array ( [category_id] => 1 [question_id] => 4 [option_id] => 8 [title] => what is your status? [answer] => single ) ) 

Средства объединяют только его ответы. Пожалуйста помоги …

возможно, что-то подобное может работать, не уверен, есть ли лучший способ сделать это:

 new_array=array(); foreach($source_array as $e){ $insert=1; foreach($new_array as $n) if(array_search($e['title'], $n)==false){ $n['answer'].=", ".$e['answer']; $insert=0; } } if($insert){ $new_array[]=$e; } } 

Для примера массива

 Array ( [0] => Array ( [category_id] => 1 [question_id] => 1 ) [1] => Array ( [category_id] => 2 [question_id] => 2 ) [2] => Array ( [category_id] => 1 [question_id] => 1 ) ) 

Вы могли бы сделать что-то подобное в качестве иллюстрации

 // Define the array to work on $array = array( array( 'category_id' => 1, 'question_id'=> 1), array( 'category_id' => 2, 'question_id' => 2), array( 'category_id' => 1, 'question_id' => 1)); // Initialize the result array containing only unique question_id/category_id combinations $unique_array = array(); foreach ($array as $key) { if (!count($unique_array)) { $unique_array[] = $key; } else { $unique = 1; foreach ($unique_array as $check) { if ( $check['category_id'] == $key['category_id'] && $check['question_id'] == $key['question_id'] ) { $unique = 0; } } if ( $unique ) { $unique_array[] = $key; } } } print_r($unique_array); 

Результатом последнего print_r будет

 Array ( [0] => Array ( [category_id] => 1 [question_id] => 1 ) [1] => Array ( [category_id] => 2 [question_id] => 2 ) ) 

Причина, по которой я спрашиваю, имеет ли порядок, заключается в том, что если это не имеет значения, вы можете сначала отсортировать свой массив, а затем сравнить только один со своим предыдущим братом:

 $source=array(array("cat_id"=>1,"ques_id"=>1,"opt_id"=>2,"title"=>"cid:1, qid:1, oid:2","answer"=>"whatever"),array("cat_id"=>1,"ques_id"=>2,"opt_id"=>3,"title"=>"cid:1, qid:2, oid:3","answer"=>"whatever"),array("cat_id"=>1,"ques_id"=>4,"opt_id"=>8,"title"=>"cid:1, qid:4, oid:8","answer"=>"whatever"),array("cat_id"=>1,"ques_id"=>2,"opt_id"=>1,"title"=>"cid:1, qid:2, oid:1","answer"=>"whtvr")); print_r($source); // just to debug usort($source,function($a,$b){ if($a["cat_id"]<$b["cat_id"]) return -1; elseif($a["cat_id"]>$b["cat_id"]) return 1; elseif($a["ques_id"]<$b["ques_id"]) return -1; elseif($a["ques_id"]>$b["ques_id"]) return 1; elseif($a["opt_id"]<$b["opt_id"]) return -1; elseif($a["opt_id"]>$b["opt_id"]) return 1; else return 0; }); $source=array_reduce($source,function(&$a,$b){ if(empty($a)) { $a=array($b); } else { $cache=array_pop($a); if($cache["cat_id"]==$b["cat_id"] && $cache["ques_id"]==$b["ques_id"]) { $cache["answer"].=", ".$b["answer"]; $a[]=$cache; } else { $a[]=$cache; $a[]=$b; } } return $a; },array()); print_r($source); 

Выходы:

 // first print_r Array ( [0] => Array ( [cat_id] => 1 [ques_id] => 1 [opt_id] => 2 [title] => cid:1, qid:1, oid:2 [answer] => whatever ) [1] => Array ( [cat_id] => 1 [ques_id] => 2 [opt_id] => 3 [title] => cid:1, qid:2, oid:3 [answer] => whatever ) [2] => Array ( [cat_id] => 1 [ques_id] => 4 [opt_id] => 8 [title] => cid:1, qid:4, oid:8 [answer] => whatever ) [3] => Array ( [cat_id] => 1 [ques_id] => 2 [opt_id] => 1 [title] => cid:1, qid:2, oid:1 [answer] => whtvr ) ) // second print_r Array ( [0] => Array ( [cat_id] => 1 [ques_id] => 1 [opt_id] => 2 [title] => cid:1, qid:1, oid:2 [answer] => whatever ) [1] => Array ( [cat_id] => 1 [ques_id] => 2 [opt_id] => 1 [title] => cid:1, qid:2, oid:1 [answer] => whtvr, whatever ) [2] => Array ( [cat_id] => 1 [ques_id] => 4 [opt_id] => 8 [title] => cid:1, qid:4, oid:8 [answer] => whatever ) ) 

Обратите внимание, что вы указали в своем комментарии, что option_id имеет значения, поэтому я не заменил его; вы можете заменить это слишком внутри анонимной функции внутри array_reduce если вам нужно.

 $data = array(); //$new is the array in which you have data originally foreach($new as $arrayK => $arrayV){ if(!isset($data[$arrayV['category_id']][$arrayV['question_id']])) $data[$arrayV['category_id']][$arrayV['question_id']] = $arrayV; else{ $option = $data[$arrayV['category_id']][$arrayV['question_id']]['option_id'] . ',' . $arrayV['option_id']; $data[$arrayV['category_id']][$arrayV['question_id']]['option_id'] = $option; $answer = $data[$arrayV['category_id']][$arrayV['question_id']]['answer'] . ',' . $arrayV['answer']; $data[$arrayV['category_id']][$arrayV['question_id']]['answer'] = $answer; } } 

$ данные будут иметь требуемые данные в указанном формате
Ответ и опция будут разделены запятыми

 foreach($arr as $k=>$a) { $common[$k] = search($arr,'category_id',$a['category_id'],'question_id',$a['question_id']); $answers = array_map(function($item) { return $item['answer']; }, $common[$k]); $options = array_map(function($item) { return $item['option_id']; }, $common[$k]); foreach($common[$k] as $temp) { $finalAns = $temp; $finalAns['answer'] = implode(",",$answers); $finalAns['option_id'] = implode(",",$options); } $final[] = $finalAns; } $final = array_map("unserialize", array_unique(array_map("serialize", $final))); echo "<pre>"; print_r($final); 

Поместите функцию ниже в свой общий файл функций или в один и тот же файл.

 function search($array, $key, $value, $key1, $value1) { $results = array(); if (is_array($array)) { if (isset($array[$key]) && $array[$key] == $value && isset($array[$key1]) && $array[$key1] == $value1) { $results[] = $array; } foreach ($array as $subarray) $results = array_merge($results, search($subarray, $key, $value,$key1,$value1)); } return $results; } 

Ваш результат будет

Массив ([0] => Массив ([category_id] => 1 [question_id] => 1 [option_id] => 2 [title] => Вы носите очки? [Ответ] => нет)

 [1] => Array ( [category_id] => 1 [question_id] => 2 [option_id] => 3,1 [title] => Your hobbies ? [answer] => movies,travel ) [2] => Array ( [category_id] => 1 [question_id] => 4 [option_id] => 8 [title] => what is your status? [answer] => single ) 

)