2014-09-09 3 views
-1

Я пытаюсь преобразовать ассоциативный массив из базы данных Drupal в многомерный массив, который я могу кодировать в json.Создайте многомерный массив из массива

Я начинаю с:

$notifications =` 

    Array 
    (
    [0] => Array 
     (
      [rfp_id] => RFP-013-2014(C) 
      [notification_type] => due_date 
     ) 

    [1] => Array 
     (
      [rfp_id] => RFP-013-2014(C) 
      [notification_type] => changes 
     ) 

    [2] => Array 
     (
      [rfp_id] => RFP-013-2014(C) 
      [notification_type] => due_date 
     ) 

    [3] => Array 
     (
      [rfp_id] => RFP-014-2014(C) 
      [notification_type] => due_date 
     ) 

    [4] => Array 
     (
      [rfp_id] => RFP-014-2014(C) 
      [notification_type] => changes 
     ) 
    ) 

Я хотел бы к группе по полю rfp_id и в конечном итоге что-то вроде:

Array (
    [0]=> Array (
    ["rfp_id"]=>"RFP-014-2014" 
    ["notification_type"]=> 
    Array (
     [0]=> "date_due" 
     [1]=> "changes" 
    ) 
) 
) 

Как бы я Переберите этот массив, чтобы создать это?

+1

В принципе, это похоже на http://stackoverflow.com/questions/25557428/custom-formatted-json-from-mysql-pdo-for-use-in-nvd3-js/25557722 –

+0

Какие усилия вы предприняли для сделай это? –

+0

@MikeBrant Я попробовал пару различных вариантов для цикла через массив. Самое близкое, что я получил, - это каждый атрибут notification_type как массив, а не весь тип уведомления в виде одного массива. – sho

ответ

1

Изменений в размерности вашего массива нет, это просто реструктурировано. Вы можете сделать это следующим образом:

foreach ($notifications as $notification) 
{ 
    $rfp_id = $notification['rfp_id']; 
    $newArray[$rfp_id]['rfp_id'] = $rfp_id; 
    $newArray[$rfp_id]['notification_type'][] = $notification['notification_type']; 
} 
echo '<pre>'.print_r($newArray,TRUE).'</pre>'; 

Как вы можете видеть, я сделал это немного отличается, как указано, только потому, что это проще. Если вы хотите цифровых клавиш вы можете сделать:

$newArray = array_values($newArray); 
+0

только с несколькими ошибками уведомления. –

+0

@ JonathanKuhn: Нет, я собирался опубликовать то же самое. Создание индексов массива «на лету» независимо от того, существует ли более высокий уровень или даже если exixts массива не генерирует уведомление. – AbraCadaver

+0

Как только я сменил print_f на print_r, это было прекрасно. Как только я вызвал array_values, я получил именно тот результат, который я искал! – sho

0

примерно такое будет работать:

$ array = array();

//loop over the array 
foreach($notifications as $row){ 
    //if this rfp id doesn't exist, add it 
    if(!isset($array[$row['rfp_id']])){ 
     //add the first entry in the array 
     $array[$row['rfp_id']] = array(
       'rfp_id'=>$row['rfp_id'], 
       'notification_type'=>array(
        $row['notification_type'] 
       ) 
      ); 
    } else { 
     //rfp_id exists, so just append the notification type 
     $array[$row['rfp_id']]['notification_type'][] = $row['notification_type']; 
    } 
} 
//get just the values to reset the first level keys to numeric. 
$array = array_values($array); 

//display the array 
echo '<pre>'.print_r($array,true).'</pre>'; 
+0

Возможно, добавьте что-то вроде 'foreach ($ array as & $ entry) {$ entry [" notification_type "] = array_unique ($ entry [" notification_type "]); } 'после' array_values', чтобы избавиться от дублированных уведомлений. –

1
<? 
$result = array(); 

foreach ($notifications as $key => $note) { 
    $result[$note['rfp_id']]['rfp_id'] = $note['rfp_id']; 
    $result[$note['rfp_id']]['notification_type'][] = $note['notification_type']; 

} 

echo '<pre>'; 
print_r($result); 
echo '</pre>'; 

?> 

Если это сделать. Поскольку вы вставляете в базу данных сразу после того, как я предполагаю, что вам не нужно переустанавливать ключи на номера.