2014-01-05 4 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;' out loop, тогда внутри цикла добавьте 'if (! $ isSet) {firstArray ...; $ isSet = TRUE; } else {secondArray ...; } ' – SSpoke

+0

Вы не должны иметь один и тот же ключ массива (artist_id, lastName) с разными значениями в одном массиве. –

ответ

1

Я не использовал PHP, пока это может не сработать.

Лучше всего было бы проверить, если по крайней мере один художник подмассив существует вместо $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(); foreach ($ stmt-> fetchAll (PDO :: FETCH_ASSOC) as $ r) { if (! Isset ($ category)) { $ category [] = array ( 'cat_id' => $ r ['cat_id' ], 'cat_description' => $ r ['cat_description'], 'artist' => $ artist ); } } ' – user3140559

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