2014-12-04 40 views
-1

我有一个脚本,它循环处理从数据库表中收集的一堆数据。我已经阅读了StackOverflow上有关合并重复数组键的其他类似帖子,但其中没有一个似乎适用于我。使用下面的代码,我建立的所有数据编制成一个数组:合并多维数组中的重复键

$sql = 'SELECT * FROM '.$qstTable.' WHERE '.$type.'_qst_id = '.$answer['answer_qst']; 
$result = $db->sql_query($sql); 
$q = $db->sql_fetchrow($result); 
$db->sql_freeresult($result); 

$sql = 'SELECT * FROM '.$catTable.' WHERE '.$type.'_cat_clean = "'.$q[$type.'_qst_cat'].'"'; 
$result = $db->sql_query($sql); 
$cat = $db->sql_fetchrow($result); 
$db->sql_freeresult($result); 

$daField = $cat[$type.'_cat_name']; 

if(count($allQsts)){ 
    if(array_key_exists($daField, $allQsts)){ 
     $daData = array(
      'question' => array(
       'id' => $q[$type.'_qst_id'], 
       'qst' => $q[$type.'_qst_qst'], 
      ), 
      'answer' => array(
       'id' => $answer['answer_id'], 
       'type' => $answer['answer_input'], 
       'content' => $answer['answer_content'], 
       'q_type' => $type, 
      ) 
     ); 
     array_push($allQsts[$daField], $daData); 
    }else{ 
     $allQsts[$cat[$type.'_cat_name']][] = array(
      'question' => array(
       'id' => $q[$type.'_qst_id'], 
       'qst' => $q[$type.'_qst_qst'], 
      ), 
      'answer' => array(
       'id' => $answer['answer_id'], 
       'type' => $answer['answer_input'], 
       'content' => $answer['answer_content'], 
       'q_type' => $type, 
      ) 
     ); 
    } 
}else{ 
    $allQsts[$cat[$type.'_cat_name']][] = array(
     'question' => array(
      'id' => $q[$type.'_qst_id'], 
      'qst' => $q[$type.'_qst_qst'], 
     ), 
     'answer' => array(
      'id' => $answer['answer_id'], 
      'type' => $answer['answer_input'], 
      'content' => $answer['answer_content'], 
      'q_type' => $type, 
     ) 
    ); 
} 

这是我的阵列是如何变成了期待,当这一切都处理:

Array ( 
    [Ancestry] => Array ( 
     [0] => Array ( 
      [question] => Array ( 
       [id] => 1 
       [qst] => Has your family always lived in this country? Where did your family come from? How did they come here? 
      ) 
      [answer] => Array ( 
       [id] => 28 
       [type] => text 
       [content] => idk 
       [q_type] => life 
      ) 
     ) 
    ) 
) 
Array ( 
    [High School] => Array ( 
     [0] => Array ( 
      [question] => Array ( 
       [id] => 158 
       [qst] => Who were your best friends in high school? Were they the same ones from grade school? Do you still keep in touch with them? 
      ) 
      [answer] => Array ( 
       [id] => 30 
       [type] => video 
       [content] => v-0bd3d270-2f24-0132-cd89-12313914f10b 
       [q_type] => life 
      ) 
     ) 
    ) 
) 
Array ( 
    [High School] => Array ( 
     [0] => Array ( 
      [question] => Array ( 
       [id] => 124 
       [qst] => What year did you start high school? What high school did you go to? Did you like it? Did you ever wish you would've gone to a different high school? 
      ) 
      [answer] => Array ( 
       [id] => 36 
       [type] => text 
       [content] => Started HS in 1987 
       [q_type] => life 
      ) 
     ) 
    ) 
) 
Array ( 
    [Young Adult] => Array ( 
     [0] => Array ( 
      [question] => Array ( 
       [id] => 213 
       [qst] => As a young adult did you stay in the same town as your friends or did you move to a new place and had to make new friends? 
      ) 
      [answer] => Array ( 
       [id] => 39 
       [type] => video 
       [content] => v-7d59df50-3bda-0132-cda7-12313914f10b 
       [q_type] => life 
      ) 
     ) 
    ) 
) 
Array ( 
    [Young Adult] => Array ( 
     [0] => Array ( 
      [question] => Array ( 
       [id] => 207 
       [qst] => After high school - did you go to college, join the miltary, or did you get a job? 
      ) 
      [answer] => Array ( 
       [id] => 40 
       [type] => text 
       [content] => went to college at ASU 
       [q_type] => life 
      ) 
     ) 
    ) 
) 
Array ( 
    [Multiple Sclerosis] => Array ( 
     [0] => Array ( 
      [question] => Array ( 
       [id] => 1278 
       [qst] => Do you know of any potential new drugs or treatments that are in development to treat multiple sclerosis? Are you optomistic? 
      ) 
      [answer] => Array ( 
       [id] => 33 
       [type] => text 
       [content] => vg hjc 
       [q_type] => pack 
      ) 
     ) 
    ) 
) 

然而,我希望做的是结合阵列中已经存在的节点,就像这样:

Array ( 
    [Ancestry] => Array ( 
     [0] => Array ( 
      [question] => Array ( 
       [id] => 1 
       [qst] => Has your family always lived in this country? Where did your family come from? How did they come here? 
      ) 
      [answer] => Array ( 
       [id] => 28 
       [type] => text 
       [content] => idk 
       [q_type] => life 
      ) 
     ) 
    ) 
) 
Array ( 
    [High School] => Array ( 
     [0] => Array ( 
      [question] => Array ( 
       [id] => 158 
       [qst] => Who were your best friends in high school? Were they the same ones from grade school? Do you still keep in touch with them? 
      ) 
      [answer] => Array ( 
       [id] => 30 
       [type] => video 
       [content] => v-0bd3d270-2f24-0132-cd89-12313914f10b 
       [q_type] => life 
      ) 
     ) 
     [1] => Array ( 
      [question] => Array ( 
       [id] => 124 
       [qst] => What year did you start high school? What high school did you go to? Did you like it? Did you ever wish you would've gone to a different high school? 
      ) 
      [answer] => Array ( 
       [id] => 36 
       [type] => text 
       [content] => Started HS in 1987 
       [q_type] => life 
      ) 
     ) 
    ) 
) 
Array ( 
    [Young Adult] => Array ( 
     [0] => Array ( 
      [question] => Array ( 
       [id] => 213 
       [qst] => As a young adult did you stay in the same town as your friends or did you move to a new place and had to make new friends? 
      ) 
      [answer] => Array ( 
       [id] => 39 
       [type] => video 
       [content] => v-7d59df50-3bda-0132-cda7-12313914f10b 
       [q_type] => life 
      ) 
     ) 
     [1] => Array ( 
      [question] => Array ( 
       [id] => 207 
       [qst] => After high school - did you go to college, join the miltary, or did you get a job? 
      ) 
      [answer] => Array ( 
       [id] => 40 
       [type] => text 
       [content] => went to college at ASU 
       [q_type] => life 
      ) 
     ) 
    ) 
) 
Array ( 
    [Multiple Sclerosis] => Array ( 
     [0] => Array ( 
      [question] => Array ( 
       [id] => 1278 
       [qst] => Do you know of any potential new drugs or treatments that are in development to treat multiple sclerosis? Are you optomistic? 
      ) 
      [answer] => Array ( 
       [id] => 33 
       [type] => text 
       [content] => vg hjc 
       [q_type] => pack 
      ) 
     ) 
    ) 
) 

如何修改上面的代码来做到这一点?

编辑 - 更新,包括一些我试图阵列压缩代码: 创建充分$allQsts阵后,我环度过这段和测试输出,而每个条目更是复制。

$sortedIt = array(); 
foreach($allQsts as $m => $n){ 
    if(!isset($sortedIt[$m])){ 
     $sortedIt[$m] = array(); 
    } 
    $sortedIt[$m] = $n; 
} 

我也一直在玩弄array_merge_recursive但还没有得到望其项背。

+1

如果你已经阅读了几篇文章,你肯定已经尝试了一些答案?换句话说,你有什么尝试? – 2014-12-04 02:17:46

+0

顺便说一句,你的输出显示6个​​数组,而不是一个单一的数组;你是如何得到这个输出的? – 2014-12-04 02:21:26

+0

@Ja͢ck我已更新该帖子以显示我尝试过的一些代码。至于输出,可能是因为代码所在的循环。这是一个可笑的复杂循环结构,可能设计不佳,但也是唯一能让整个事情起作用的方法。 – chaoskreator 2014-12-04 02:28:21

回答

0

假设这在循环中运行,并且每个时间$allQsts指向相同的数组,就可以大幅度地简化代码:

$daField = $cat[$type.'_cat_name']; 
$daData = array(
    'question' => array(
     'id' => $q[$type.'_qst_id'], 
     'qst' => $q[$type.'_qst_qst'], 
    ), 
    'answer' => array(
     'id' => $answer['answer_id'], 
     'type' => $answer['answer_input'], 
     'content' => $answer['answer_content'], 
     'q_type' => $type, 
    ) 
); 

if (array_key_exists($daField, $allQsts)) { 
    $allQsts[$daField][] = $daData; 
} else { 
    $allQsts[$daField] = array($daData); 
} 

这本身应该足以获得所需的数据结构。

+0

它似乎部分工作,但在其中一个循环结束时,我取消设置'$ allQsts',因为我在处理循环时遇到了数据倍增,然后三倍等问题。如果你愿意,我可以将整个脚本发布到pastebin或其他东西上,这样你就可以看一看。就像我说的那样,这很复杂而且令人费解。 – chaoskreator 2014-12-04 02:39:32

+0

@chaoskreator你必须首先弄清楚它为什么是双倍和三倍。 – 2014-12-04 02:40:39