PHP bir iç içe geçmiş çok boyutlu dizi çok boyutlu dizi

4 Cevap php

Ben şöyle bir dizi var:

   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

Ben bu almak ve böylece gibi iç içe bir dizi dönüştürmek için çalışıyordu:

 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'
                                       )
                       )
 );

Ve ben çalışmıyor bu foreach döngü kullanıyorum, o yüzden son giriş sadece bir bölümü giriş ile sol kulüpler her bölümü girişini değiştirir.

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

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

}

Bu foreach döngüsü bana bu sonucu verir:

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

Ben burada neyin yanlış olduğunu anlayamıyorum .. Herkes burada bana yardımcı olabilir?

4 Cevap

Sorun $result[$r['sname']] her seferinde yeniden tanımlıyor olmasıdır. Sadece zaten tanımlı değilse onu tanımlamak gerekir.

$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'];

}

isset() veya array_key_exists() önceden bunun yeniden yazılmasını kalmaması ile anahtarın varlığını kontrol edin.

ben seni istiyorum:

$result[$r['sname']][] = array('id' => $r['sid'], 'divisions' => array($r['did'] => $r['dname']));
$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']))
    }
}

Ne şu anda yapıyorsun $result[$r['sname']] için giriş yazılmadan, bu yüzden sadece hiç bu bir dizi olacak.

Kullandığım if $array[] = array_push see php docs daha hızlı olduğu için