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?
- 1529 megtekintés
Hozzászólások
foreach($a2 as $line) $a1[]=$line;
- A hozzászóláshoz be kell jelentkezni
http://hu2.php.net/array_merge
No rainbow, no sugar
- A hozzászóláshoz be kell jelentkezni
Közben javítottam a hozzászólásomat. Pont úgy írtam fel ahogyan nem szerettem volna, hogy működjön. Az array_merge nem jó. Bocsi és a javítás tükrében van megoldás?
- A hozzászóláshoz be kell jelentkezni
két tömbböl szeretnél csinálni egyet, úgy hogy a létrejövő új tömbben a két tömb elemei felváltva egymás után legyenek
ezt szeretnéd?
No rainbow, no sugar
- A hozzászóláshoz be kell jelentkezni
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;
}
- A hozzászóláshoz be kell jelentkezni
Sajnos korai volt az öröm.
Csak az ilyen típusnál működik.
$items[] = array("here" => "now");
$moreitems[] = array("this" => "that", "color" => "red");
Ha többdimenziós akkor már nem megy.
Ötlet valakinek?
- A hozzászóláshoz be kell jelentkezni
array_merge_recursive
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
Erre miért nem jó az SQL JOIN?
"A fejlesztot azert fizetik, hogy oldja meg a problemat. Ez egy kemeny szakma." - Chain-Q
- A hozzászóláshoz be kell jelentkezni
És hogyan tudok a kettő lekérdezésből csinálni egyet?
- A hozzászóláshoz be kell jelentkezni
$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
- A hozzászóláshoz be kell jelentkezni
Köszi a segítséget. Kezd alakulni. Már csak annyi, hogy az id csak a képes táblában jelenik meg. Amihez nincs kép ott az id nem jelenik meg. Érdekes, hogy a többi adat meg van. A másik, hogy nem véletlenszerűen választja ki a hozzá tartozó képet.
- A hozzászóláshoz be kell jelentkezni
up
- A hozzászóláshoz be kell jelentkezni
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;
...
}
- A hozzászóláshoz be kell jelentkezni
Az másodikat kéretik nem használni. Direktszorzat helyett van INNER JOIN és NATURAL JOIN. Ugyanaz, csak sokkal gyorsabb.
"A fejlesztot azert fizetik, hogy oldja meg a problemat. Ez egy kemeny szakma." - Chain-Q
- A hozzászóláshoz be kell jelentkezni
Ok, a lényeg az, hogy id-re rendezve legyen a lista, és kirakásnál figyelje, hogy csak egyszer rakja ki.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
SELECT ..., auction_end-now() AS lejarati_ido FROM ...
WHERE auction_end >= now() AND ...
"A fejlesztot azert fizetik, hogy oldja meg a problemat. Ez egy kemeny szakma." - Chain-Q
- A hozzászóláshoz be kell jelentkezni
Köszi. Ez szuper. És azt hogy tudom megoldani, hogy megfelelő formában írja ki? Most ilyen: 99969091.000000
- A hozzászóláshoz be kell jelentkezni
elolvasod a mysql dokumentaciot.
t
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni