2013-01-10 37 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

我只是将这个作为您的示例。 –

相关问题