PHP / MySQL - nasıl multidimensinal diziye iç içe satır getirmek için

2 Cevap php

Gelen another question of mine HİÇ ben dolayısıyla bunun üzerinden ben döngü önce uygun bir şekilde tüm verileri almak için öğrenmek zorunda döngüler içinde db sorguları kullanmak için değil öğrendim.

Elimde iki tablo 'terazi' ve 'ürün' var diyelim. Öğeleri her öğe ölçeklerde bir ölçek ait ve bir yabancı anahtar (scaleID) ile bağlantılıdır. Ben Birinci boyut, tüm sütunları ile tüm ölçekler vardır ve bir ölçekte tüm sütunlar tüm öğeleri içinde yuvalanmış şekilde, bir sorguda bir dizi yapısı içinde tüm bu verileri almak istiyorum.

Sonuç böyle bir şey olurdu:

scale 1, scaleParam1, scaleParam2, ...
....item1, itemParam1, itemParam2, ...
....item2, itemParam1, itemParam2, ...
scale 2, scaleParam2, scaleParam2, ...
....item1, itemParam1, itemParam2, ...
....item2, itemParam1, itemParam2, ...

Şimdiye kadar tek-bir ilişkileri ağırlıklı sol katılır yaptık. Bu tek-çok-ve ben sadece etrafında fikrimi sarın olamaz.

Nasıl içine de tam dış satırları almak için de bir alt sorgu ile yapılabilir bir katılma hakkı, vardır ...

Daha sonra iç içe foreach döngüler ile üzerinden yineleme yapmak istiyorum.

Belki de ben bir baş ağrısı var sadece ...

2 Cevap

Sorgu bu gibi görünmelidir:

SELECT * FROM scales
INNER JOIN items ON scales.id = items.scale_id

Eğer iç içe döngüler ile üzerinden yineleme yapmak istiyorsanız, bir diziye bu verileri çekmek gerekir - umarım geri çok fazla bellek yerim o kadar çekerek değil.

$scales = array();

while ($row = mysql_fetch_assoc($data))
{
    if (!isset($scales[$row['scale_id']]))
    {
        $row['items'] = array();
        $scales[$row['scale_id']] = $row;
    }

    $scales[$row['scale_id']]['items'][] = $row;
}

Sonra yapabilirsiniz loop through:

foreach ($scales as $scale)
{
    foreach ($scale['items'] as $item)
        ; //... do stuff
}

Not: Bu o $ ölçekte biraz naif ve o zaman yalnızca istediğiniz alanları çekin yukarıdaki döngüde atamaları değiştirmeniz gereken bir sorun varsa $ öğe her iki ... İKİ tablolardan alanlar içerecektir.

İlk sonra tüm ölçekler, tüm öğeleri almak için daha kolay olabilir.

//first get scales
while ($row = fetchrowfunctionhere()) {
    $scale = $scales->createFromArray($row);
}

//then get items
$lastId = null;
while ($row = fetchrowfunctionhere()) {
    $scaleId = $row['scaleID'];
    if ($lastId != $scaleId) {
        $scale = $scales->getByScaleId($scaleId);
    }
    $item = $items->createFromArray($row);
    $scale->addItem($item);
    $lastId = $scaleId;
}

veya bir sql her şeyi

$lastId = null;
while ($row = fetchrowfunctionhere()) {
    $scaleData = array_slice($row, 0, 5, true);
    $itemData = array_slice($row, 5, 5, true);
    $scaleId = $scaleData['scaleID'];
    if ($lastId != $scaleId) {
        $scale = $scales->createFromArray($scaleData);
    }
    $item = $items->createFromArray($itemData);
    $scale->addItem($item);
    $lastId = $scaleId;
}

mutlu bir dizi gibi her şey

while ($row = fetchrowfunctionhere()) {
    $scaleData = array_slice($row, 0, 5, true);
    $itemData = array_slice($row, 5, 5, true);
    $scaleId = $scaleData['scaleID'];
    if (!isset($scales[$scaleId])) {
        $scales[$scaleId] = $scaleData;
    }
    $itemId = $itemData['itemID'];
    $scales[$scaleId]['items'][$itemId] = $itemData;
}