У меня выводится только первая строка результатов. Почему? Код (Text): $size_list = mysql_query ("SELECT tp.*, tv.*, ts.* FROM product_info AS tp LEFT JOIN vsc_links AS tv ON (tp.id = tv.product_id) LEFT JOIN size AS ts ON (tv.sizeid = ts.size_id) WHERE tp.parent_categorie = ".$cat." AND tp.onoff = 1 AND tv.vsc_onoff = 1"); while ($size = mysql_fetch_array($size_list)) { $sss[] = array($size['size_id'] => $size['size_name']); } $sizes = array_unique($sss); var_dump ($sizes);
Не первая, а последняя. Потому, что ты выводишь не в цикле, а за ним. edited: писал с телефона, толком не рассмотрел (
Так только слово Array выводит Код (Text): while ($size = mysql_fetch_array($size_list)) {$sss[] = array($size['size_id'] => $size['size_name']);} $sizes = array_unique($sss); foreach($sizes as $key => $value) {echo $key." ".$value;}
Не одно Добавлено спустя 10 минут 45 секунд: Решил искать по частям Код (Text): while ($size = mysql_fetch_array($size_list)) {$sss[] = $size['size_name'];} $sizes = array_unique($sss); foreach($sizes as $value) {echo $value;} Тут все работает. Но в базе есть size_id, как уникальный для size_name. Мне надо чтобы выводилось оба значения. Вот как это сделать не знаю
Т.к. array_unique не работает с многомерными массивами, то решил свою проблему таким образом: Код (Text): while ($size = mysql_fetch_array($size_list)) {$sss[] = $size['size_id'];} $sizes = array_unique($sss); foreach($sizes as $value) { $sname_list = mysql_query("SELECT * FROM size WHERE size_id = ".$value.""); $sname = mysql_fetch_array($sname_list); echo "<a href='catalog.php?cat=".$cat."&sid=".$value."' class=''>".$sname['size_name']."</a> "; } Всё работает! Но у меня вопрос к профессионалам: насколько корявая такая конструкция?
ну если размеров Н то делать лишних Н запросов это не просто коряво... это убийственно. я бы глубже капнул в сторону отладки первого кода. проще свой итератор уников сделать чем допускать лишние запросы к субд. Добавлено спустя 57 секунд: и кстати да, сурикат не просто так просит показать вардамп - мы своим умелым взглядом сможем прикинуть что не так срабатывает в штатной функции.
При таком коде: Код (Text): while ($size = mysql_fetch_array($size_list)) {$sss[] = array($size['size_id'] => $size['size_name']);} $sizes = array_unique($sss); foreach($sizes as $key => $value) {echo $key." ".$value;} var_dump($sss); Возвращает: array(308) { [0]=> array(1) { [2]=> string(7) "1 (65B)" } [1]=> array(1) { [2]=> string(7) "1 (65B)" } [2]=> array(1) { [2]=> string(7) "1 (65B)" } [3]=> array(1) { [3]=> string(7) "1 (65C)" } [4]=> array(1) { [3]=> string(7) "1 (65C)" } [5]=> array(1) { [3]=> string(7) "1 (65C)" } [6]=> array(1) { [3]=> string(7) "1 (65C)" } [7]=> array(1) { [4]=> string(7) "1 (65D)" } [8]=> array(1) { [4]=> string(7) "1 (65D)" } } и т.д.
while ($size = mysql_fetch_array($size_list)) { $sizes[$size['size_id']] = $size['size_name']; } я угадал? нужно просто выбрать пары идентификаторов-имен размеров?
Думаю самым разумным решением будет попросить SQL выдавать уже уникальные данные, а не пытаться их уникализировать на PHP. SELECT DISTINCT вам в помощь (хоть я и не люблю его).
))) Угадал! Это была моя самая первая мысль, но я так и не догадался, как ее реализовать в этом случае: Код (Text): $size_list = mysql_query ("SELECT tp.*, tv.*, ts.* FROM product_info AS tp LEFT JOIN vsc_links AS tv ON (tp.id = tv.product_id) LEFT JOIN size AS ts ON (tv.sizeid = ts.size_id) WHERE tp.parent_categorie = ".$cat." AND tp.onoff = 1 AND tv.vsc_onoff = 1"); Код (Text): array(308) { [0]=> array(1) { [2]=> string(7) "1 (65B)" } [1]=> array(1) { [2]=> string(7) "1 (65B)" } [2]=> array(1) { [2]=> string(7) "1 (65B)" } [3]=> array(1) { [3]=> string(7) "1 (65C)" } [4]=> array(1) { [3]=> string(7) "1 (65C)" } [5]=> array(1) { [3]=> string(7) "1 (65C)" } [6]=> array(1) { [3]=> string(7) "1 (65C)" } [7]=> array(1) { [4]=> string(7) "1 (65D)" } }
я тебе помогу http://phpbeautifier.com/beautify.php Код (PHP): <?php array( 308 ) { [0] => array( 1 ) { [2] => string(7) "1 (65B)" } [1] => array( 1 ) { [2] => string(7) "1 (65B)" } [2] => array( 1 ) { [2] => string(7) "1 (65B)" } [3] => array( 1 ) { [3] => string(7) "1 (65C)" } [4] => array( 1 ) { [3] => string(7) "1 (65C)" } [5] => array( 1 ) { [3] => string(7) "1 (65C)" } [6] => array( 1 ) { [3] => string(7) "1 (65C)" } [7] => array( 1 ) { [4] => string(7) "1 (65D)" } }
LAlexS, ну во первых, врядли вам нужно делать tp.*, tv.*, ts.* когда вас интересуют только size_id и size_name. Оставьте только их. Правило DISTINCT заставляет сервер БД сравнивать записи целиком, т.е. все перечисленные поля, и оставлять только уникальные сочетания. То есть буквально то, что вы хотели получить от array_unique, но он так не умеет Итого: "SELECT DICTINCT ts.size_id, ts.size_name FROM…" или даже "SELECT DICTINCT ts.size_name FROM…" , что реально нужно — вам виднее. Добавлено спустя 1 минуту 10 секунд: Того же можно добиться через "…GROUP BY список уникальных полей".
Круто! Я почему-то на автомате написал tp.*, tv.*, ts.* и сразу зациклился, что они тут должны быть, поэтому никак не мог впихнуть DISTINCT, вот и начал к array_unique присматриваться! Я невероятно благодарен за помощь!!!