Két tömb egyesítésee

Sziasztok!

Sehogy sem akar összejönni, hogy két tömböt összefüzzel úgy ahogy nekem kell.

Tömb 1.
$sql = $db -> query("SELECT * FROM tabla");
while ($x = $db -> fetch_assoc($sql)) $a1[] = $x;
print_r($a1);
Array ( [0] => Array ( [id] => 1[here] => now ) )
Tömb 2.
$sql = $db -> query("SELECT * FROM tabla");
while ($x = $db -> fetch_assoc($sql)) $a2[] = $x;
print_r($a2);
Array ( [0] => Array ( [this] => 1[xy] => valami ) )

És így szeretném ha kinézne.
print_r($eredmeny);
Array ( [0] => Array ( [id] => 1[here] => now[this] => 1[xy] => now ) )

Tud valaki erre megoldást?

Hozzászólások

foreach($a2 as $line) $a1[]=$line;

Igen ezt szeretném. Közben sikerült megoldanom így.
function ArrayMerge(&$a, &$b) {
$keys = array_keys($a);
foreach ($keys as $key) {
if (isset($b[$key])) {
if (is_array($a[$key]) and is_array($b[$key])) {
ArrayMerge($a[$key],$b[$key]);
}
else{
$a[$key] = $b[$key];
}}}
$keys = array_keys($b);
foreach ($keys as $key) {
if (!isset($a[$key])) {
$a[$key] = $b[$key];
}}
return $a;
}

Próbáltam, de nem azt az eredményt hozta ami kell.
Ezt szeretném megodlani.
$r = $db -> query("SELECT * FROM send AS A, login_users AS U WHERE A.uid = U.uid && A.close = 0 ORDER BY A.end DESC");
while ($x = $db -> fetch_assoc($r)) {
$a[] = $x;
$randimg[] = $this -> RandomAukcioImage($x['id']);
$system -> ArrayMerge($a, $randimg);
}

function RandomAukcioImage($id) {
global $db;
$r = $db -> query("SELECT * FROM images WHERE id = $id ORDER BY RAND() LIMIT 1");
$x = $db -> fetch_assoc($r);

return $x;
}

No erről lene szó. Az a[] tömbbe kellene beletenni a randimg[] tömböt. Igazából azt szeretném, hogy az első lekérdezéshez hozzáillesszem a hozzá tartozó képet ha van. Ha nincs akkor nincs hozzáillesztés.

$r = $db -> query("SELECT * FROM send AS A, login_users AS U WHERE A.uid = U.uid && A.close = 0 ORDER BY A.end DESC");
while ($x = $db -> fetch_assoc($r)) {
$a[] = $x;
$randimg[] = $this -> RandomAukcioImage($x['id']);
$system -> ArrayMerge($a, $randimg);
}

function RandomAukcioImage($id) {
global $db;
$r = $db -> query("SELECT * FROM images WHERE id = $id ORDER BY RAND() LIMIT 1");
$x = $db -> fetch_assoc($r);

return $x;
}

Ez az alap kód. Ez elég lassú, mert ahány sort ad vissza az első lekérés, annyiszor futtat még egyet. Ráadásul JOIN helyett direktszorzatot használsz, ami megint odavág a sebességnek és a memóriahasználatnak.

Kicsit rendberakva ez így nézne ki:

SELECT *
FROM send
INNER JOIN login_users USING (uid)
LEFT JOIN images ON send.id = images.id AND images.id = (SELECT id FROM images WHERE id = send.id ORDER BY RANDOM() LIMIT 1)
WHERE A.close = 0 ORDER BY send.end DESC

Még lehetne mit csiszolni rajta, az a subquery nem szép a JOIN-ban, de most hirtelen nem volt jobb ötletem :)

"A fejlesztot azert fizetik, hogy oldja meg a problemat. Ez egy kemeny szakma." - Chain-Q

Hali, szerintem is SQL szinten kellene megoldanod a problémát. Szerintem

SELECT a.*,b.kep FROM tetelek a LEFT JOIN kepek b ON b.tetelId=a.id ORDER BY RAND(),a.id;

jó lesz (nem vagyok hirtelen biztos benne, de próbáld ki). Ha nem, akkor egy erőforrás igényesebb, de garantáltan jó megoldás:

SELECT a.*,b.kep FROM tetelek a, kepek b WHERE b.tetelId=a.id ORDER BY RAND(),a.id;

Majd kirakásnál ilyent csinálsz:

$lastid=0;
for($i=0;$i<count($rows);$i++){
if($rows[$i]->id==$lastid) continue; else $lastid=$rows[$i]->id;
...
}

Itt tartok. Három táblát sikerült összekapcsolni.
Viszont a RAND() sehogy se akart menni. Mindig a legelső találatot adta ami a táblában volt.

$r = $db -> query("SELECT login_users.*, aukcio_send.*, COUNT(aukcio_licit.licit_id) AS licitszam, aukcio_images.image_id, aukcio_images.filename, aukcio_images.ext FROM aukcio_send
INNER JOIN login_users USING (uid)
LEFT JOIN aukcio_licit ON aukcio_send.aukcio_id = aukcio_licit.aukcio_id
LEFT JOIN aukcio_images ON aukcio_send.aukcio_id = aukcio_images.aukcio_id && aukcio_images.image_default = 1
WHERE aukcio_send.aukcio_close = 0
GROUP BY aukcio_send.aukcio_id
ORDER BY aukcio_send.aukcio_end DESC");

Még egy olyat szeretnék kiiratni vele, hogy hány nap van még hátra az aukcióból. Az aukcio_send táblában van egy ilyen: aukcio_end ilyen formában 0000-00-00 00:00:00
Ezt hogyan tudom kiszámoltatni sql lekérdezéssel? Elég a nap,óra,perc,másodperc

Hmmm, kicsit elgondolkodtam a problémán. Szerintem 1 query-ből nem megoldható, a következők miatt:
1) JOIN-al nem lehet a sorrendet befolyásolni
2) szorzás esetén kimaradnak azok a tételek, melyekhez nincs kép
3) nem lehet előbb rendezni, aztán group by-olni (itt ez kéne)

Szóval szerintem kielégítő megoldás mindenképp több query-t igényel:
1) lekéred a tételeket (mindet, sorrendben)
2) lekérsz minden tételhez véletlenszerűen egy képet hozzá (vagy NULL, ha nincs kép)
Ezt persze lehet egy query a queryben is.