2013-01-10 36 views
0

我有一個多維數組結合了相同的值數組的關鍵 - 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 
    ) 
) 

在其第二和第四個數組包含同一個問題(同一類別ID和相同的問題ID) 我想結合具有相同類別ID和問題ID的數組。

什麼,我希望是這樣的

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 
    ) 
) 

意味着只有結合其答案。請幫助...

+0

命令是否重要? – Passerby

+0

option_id不一樣,你只保留一個。它是否正確? – Dutow

+0

@Passerby不是問題 – FrancisMV123

回答

0

也許這樣的事情可以工作,不知道是否有更好的方法來做到這一點壽:

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

這是什麼$ source_array&$ new_array? – FrancisMV123

+0

$ source_array是具有重複值的那個,$ new_array是具有重複值融合到1個位置的新的數字 – Naryl

0

舉一個例子陣列

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 
    ) 

) 
0

我之所以問,如果順序問題是,如果沒關係,可以先進行排序的數組,然後只有每一個比較其以前的兄弟:

$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內的匿名功能內部替換它。

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

$數據將有需要的數據中提到的格式
答案和選擇將是逗號分隔

0
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 [標題] =>你戴眼鏡嗎? [答案] =>沒有 )

[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 
    ) 

+0

我只是將這個作爲您的示例。 –

相關問題