2014-12-04 2 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 
      ) 
     ) 
    ) 
) 

Как я могу изменить код, чтобы сделать это?

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

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

Я также играл с array_merge_recursive, но до сих пор, чтобы получить где-нибудь близко.

+1

Если вы прочитали несколько сообщений, наверняка вы должны были попробовать некоторые ответы? Другими словами, что вы пробовали? –

+0

Btw, ваш вывод показывает 6 массивов, а не один массив; как вы получили этот результат? –

+0

@ Ja͢ck Я обновил сообщение, чтобы показать код, который я пробовал. Что касается вывода, это, вероятно, из-за цикла, в котором находится код. Это смехотворно сложная структура цикла, вероятно, плохо спроектированная, но и единственный способ заставить все это работать. – chaoskreator

ответ

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

+0

@chaoskreator Сначала вам нужно выяснить, почему он удваивается и утроится. –

Смежные вопросы