2009-12-12 2 views
1

У меня есть массив следующим образом:многомерные массив вложенной многомерного массива в PHP

sid   sname    did    dname 
    1   Basketball   1     Mini 
    1   Basketball   3     Cadet 
    2   Baseball    8    Little League 
    2   Baseball    6    Junior League 
    1   Basketball   5    Masters 

Я пытался получить это и превратить его в гнездовой массив следующим образом:

array('Basketball' => array(
         'id' => 1, 
         'divisions' => array(
              1 => 'Mini', 
              3 => 'Cadet', 
              5 => 'Masters' 
             ) 
         ), 
     'Baseball' => array(
         'id' => 2, 
         'divisions' => array(
              8 => 'Little League', 
              6 => 'Junior League' 
             ) 
         ) 
); 

И Я использую этот цикл foreach, который не работает, он заменяет каждую запись деления, поэтому мне остается только одна запись деления, которая является последней записью.

$result = ''; 
foreach($row as $r) 
{ 

    $result[$r['sname']] = array('id' => $r['sid'], 'divisions' => array($r['did'] => $r['dname'])); 

} 

Этот Еогеасп цикл дает мне этот результат:

array('Basketball' => array(
         'id' => 1, 
         'divisions' => array(
              5 => 'Masters' 
             ) 
         ), 
     'Baseball' => array(
         'id' => 2, 
         'divisions' => array(
              6 => 'Junior League' 
             ) 
         ) 
); 

Я не понимаю, что здесь не так .. может кто-нибудь помочь мне здесь?

ответ

3

Проблема заключается в том, что вы заново $result[$r['sname']] каждый раз. Вам нужно только определить его, если он еще не определен.

$result = array(); // initialize this to an appropriate type! 
foreach($row as $r) 
{ 

    if(!isset($result[$r['sname']])) 
    { 
     $result[$r['sname']] = array('id' => $r['sid'], 'divisions' => array($r['did'] => $r['dname'])); 
     continue; 
    } 
    $result[$r['sname']]['divisions'][$r['did']] = $r['dname']; 

} 
0

Проверьте наличие ключа с isset() или array_key_exists() заранее, чтобы он не переписывался.

0

я думаю, что вы хотите:

$result[$r['sname']][] = array('id' => $r['sid'], 'divisions' => array($r['did'] => $r['dname'])); 
1
$result = array(); 
foreach($row as $r) 
{ 

    $result[$r['sname']]['id'] = $r['sid']; 
    $result[$r['sname']]['divisions'][$r['did']] = $r['dname']; 

} 
+0

+1 Предполагая, что это работает, это довольно элегантное чтение. Конечно, он каждый раз инициализирует значение «id», но это не так дорого. –

+0

BTW ... это работает. благодаря – moleculezz

0
$result = array(); 
foreach($row as $r) 
{ 
    if(isset($result[$r['sname']])) 
    { 
     array_push($result[$r['sname']], array('id' => $r['sid'], 'divisions' => array($r['did'] => $r['dname']))); 
    } 
    else 
    { 
     $result[$r['sname']] = array('id' => $r['sid'], 'divisions' => array($r['did'] => $r['dname'])) 
    } 
} 

Что вы сейчас делаете перезапись запись для $result[$r['sname']], так что это будет только когда-либо один массив в нем.

Я использую if потому $array[] = быстрее, чем array_pushsee php docs

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