2014-01-05 67 views
1

我是多維數組的新手,遇到了一個問題,無法繞過它。我一直在試圖把這樣的:PHP/MySQL多維數組

Array 
(
    [1] => Array 
     (
      [cat_id] => 1 
      [cat_name] => Schilderijen 
      [cat_description] => Omschrijving bij schilderijen 
      [artists] => Array 
       (
        [artist_id] => 1 
        [lastName] => ..some value 
       ) 

     ) 

) 
Array 
(
    [1] => Array 
     (
      [cat_id] => 1 
      [cat_name] => Schilderijen 
      [cat_description] => Omschrijving bij schilderijen 
      [artists] => Array 
       (
        [artist_id] => 4 
        [lastName] => ..some value 
       ) 

     ) 

) 

弄成這個樣子,所以我可以調用一個類別,並列出了相關的藝術家下方:

 
Array 
(
    [1] => Array 
     (
      [cat_id] => 1 
      [cat_name] => Schilderijen 
      [cat_description] => Omschrijving bij schilderijen 
      [artists] => Array 
       (
        [artist_id] => 1 
        [lastName] => ..some value 
        [artist_id] => 4 
        [lastName] => ..some value 
       ) 

     ) 

) 

我使用下面的代碼:

$cat_id = 1; 

$query = "SELECT * FROM `categorie_has_artists` "; 
$query .= " JOIN `categories` ON categories.cat_id = categorie_has_artists.cat_id AND categorie_has_artists.cat_id = :cat_id"; 
$query .= " JOIN `artists` ON artists.artist_id = categorie_has_artists.artist_id"; 

$stmt = $dbh->prepare($query); 
$stmt->bindParam(':cat_id', $cat_id, PDO::PARAM_INT); 
$stmt->execute(); 

while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 
    $array[$row['cat_id']] = array('cat_id' => $row['cat_id'], 'cat_name' => $row['cat_name'], 'cat_description' => $row['cat_description'], 'artist' => array()); 
    $array[$row['cat_id']]['artist'][] = array('artist_id'=>$row['artist_id'], 'lastName' => $row['lastName']); 
} 
+0

第一陣列應在外部循環中,第二個應該在循環中。 make'$ isSet = false;'外部循環然後在循環內部添加'if(!$ isSet){firstArray ...; $ isSet = TRUE; } else {secondArray ...; }' – SSpoke

+0

您不應該在同一個數組中使用不同值的相同數組鍵(artist_id,lastName)。 –

回答

1

我有一段時間沒有使用PHP,這可能無法正常工作。

更好的方式是,以檢查是否ATLEAST一個藝術家子陣列exists代替$isSet標誌

$cat_id = 1; 

$query = "SELECT * FROM `categorie_has_artists` "; 
$query .= " JOIN `categories` ON categories.cat_id = categorie_has_artists.cat_id AND categorie_has_artists.cat_id = :cat_id"; 
$query .= " JOIN `artists` ON artists.artist_id = categorie_has_artists.artist_id"; 

$stmt = $dbh->prepare($query); 
$stmt->bindParam(':cat_id', $cat_id, PDO::PARAM_INT); 
$stmt->execute(); 

$isSet = FALSE; 

while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 
    if(!$isSet) { 
    $array[$row['cat_id']] = array('cat_id' => $row['cat_id'], 'cat_name' => $row['cat_name'], 'cat_description' => $row['cat_description'], 'artist' => array()); 
    $isSet = TRUE; 
    } else { 
    $array[$row['cat_id']]['artist'][] = array('artist_id'=>$row['artist_id'], 'lastName' => $row['lastName']); 
    } 
} 

這是其他的方式來做到這一點(也可能無法正常工作)

$cat_id = 1; 

$query = "SELECT * FROM `categorie_has_artists` "; 
$query .= " JOIN `categories` ON categories.cat_id = categorie_has_artists.cat_id AND categorie_has_artists.cat_id = :cat_id"; 
$query .= " JOIN `artists` ON artists.artist_id = categorie_has_artists.artist_id"; 

$stmt = $dbh->prepare($query); 
$stmt->bindParam(':cat_id', $cat_id, PDO::PARAM_INT); 
$stmt->execute(); 

while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ 
    if(!isset($array[$row['cat_id']][$row['cat_name']][$row['cat_description']])) { 
    $array[$row['cat_id']] = array('cat_id' => $row['cat_id'], 'cat_name' => $row['cat_name'], 'cat_description' => $row['cat_description'], 'artist' => array()); 
    } else { 
    $array[$row['cat_id']]['artist'][] = array('artist_id'=>$row['artist_id'], 'lastName' => $row['lastName']); 
    } 
} 
+1

感謝您對isset的提示。這適用於我:\t'foreach($ stmt-> fetchAll(PDO :: FETCH_ASSOC)as $ r){ $ artist [] = array( 'artist_id'=> $ r ['artist_id'], 'lastName '=> $ r ['lastName'] ); } $ stmt-> execute(); ($ ism($ category)){ $ category [] = array( 'cat_id'=> $ r ['cat_id' ], 'cat_description'=> $ r ['cat_description'], 'artists'=> $ artist ); } }' – user3140559