За последние 24 часа нас посетили 18102 программиста и 1599 роботов. Сейчас ищут 911 программистов ...

Подскажите по массивам

Тема в разделе "PHP для новичков", создана пользователем LAlexS, 13 мар 2015.

  1. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    У меня выводится только первая строка результатов. Почему?
    Код (Text):
    1. $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");
    2. while ($size = mysql_fetch_array($size_list))
    3.     {
    4.     $sss[] = array($size['size_id'] => $size['size_name']);
    5.     }
    6. $sizes = array_unique($sss);
    7. var_dump ($sizes);
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Не первая, а последняя.

    Потому, что ты выводишь не в цикле, а за ним.

    edited: писал с телефона, толком не рассмотрел (
     
  3. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Так только слово Array выводит :(
    Код (Text):
    1. while ($size = mysql_fetch_array($size_list))
    2.     {$sss[] = array($size['size_id'] => $size['size_name']);}
    3. $sizes = array_unique($sss);
    4. foreach($sizes as $key => $value)
    5.     {echo $key." ".$value;}
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    А var_dump ($sss); что возвращает? Может просто у тебя только одно уникальное значение?
     
  5. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Не одно

    Добавлено спустя 10 минут 45 секунд:
    Решил искать по частям
    Код (Text):
    1. while ($size = mysql_fetch_array($size_list))
    2.     {$sss[] = $size['size_name'];}
    3. $sizes = array_unique($sss);
    4. foreach($sizes as $value)
    5.     {echo $value;}
    Тут все работает. Но в базе есть size_id, как уникальный для size_name. Мне надо чтобы выводилось оба значения. Вот как это сделать не знаю
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
     
  7. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Весь список выборки. Он длинный, не буду здесь его приводить
     
  8. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Т.к. array_unique не работает с многомерными массивами, то решил свою проблему таким образом:
    Код (Text):
    1. while ($size = mysql_fetch_array($size_list))
    2.     {$sss[] = $size['size_id'];}
    3. $sizes = array_unique($sss);
    4. foreach($sizes as $value)
    5.     {
    6.     $sname_list = mysql_query("SELECT * FROM size WHERE size_id = ".$value."");
    7.     $sname = mysql_fetch_array($sname_list);
    8.     echo "<a href='catalog.php?cat=".$cat."&sid=".$value."' class=''>".$sname['size_name']."</a> ";
    9.     }
    Всё работает! Но у меня вопрос к профессионалам: насколько корявая такая конструкция?
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну если размеров Н то делать лишних Н запросов это не просто коряво... это убийственно. я бы глубже капнул в сторону отладки первого кода. проще свой итератор уников сделать чем допускать лишние запросы к субд.

    Добавлено спустя 57 секунд:
    и кстати да, сурикат не просто так просит показать вардамп - мы своим умелым взглядом сможем прикинуть что не так срабатывает в штатной функции.
     
  10. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    При таком коде:
    Код (Text):
    1. while ($size = mysql_fetch_array($size_list))
    2.    {$sss[] = array($size['size_id'] => $size['size_name']);}
    3. $sizes = array_unique($sss);
    4. foreach($sizes as $key => $value)
    5.    {echo $key." ".$value;}
    6.    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)" } }
    и т.д.
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Оберните var_dump в <pre></pre>, пожалуйста.
     
  12. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    while ($size = mysql_fetch_array($size_list)) {
    $sizes[$size['size_id']] = $size['size_name'];
    }

    я угадал? нужно просто выбрать пары идентификаторов-имен размеров?
     
  13. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    Думаю самым разумным решением будет попросить SQL выдавать уже уникальные данные, а не пытаться их уникализировать на PHP.
    SELECT DISTINCT вам в помощь (хоть я и не люблю его).
     
  14. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    ))) Угадал!

    Это была моя самая первая мысль, но я так и не догадался, как ее реализовать в этом случае:
    Код (Text):
    1. $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):
    1. array(308) {
    2.   [0]=>
    3.   array(1) {
    4.     [2]=>
    5.     string(7) "1 (65B)"
    6.   }
    7.   [1]=>
    8.   array(1) {
    9.     [2]=>
    10.     string(7) "1 (65B)"
    11.   }
    12.   [2]=>
    13.   array(1) {
    14.     [2]=>
    15.     string(7) "1 (65B)"
    16.   }
    17.   [3]=>
    18.   array(1) {
    19.     [3]=>
    20.     string(7) "1 (65C)"
    21.   }
    22.   [4]=>
    23.   array(1) {
    24.     [3]=>
    25.     string(7) "1 (65C)"
    26.   }
    27.   [5]=>
    28.   array(1) {
    29.     [3]=>
    30.     string(7) "1 (65C)"
    31.   }
    32.   [6]=>
    33.   array(1) {
    34.     [3]=>
    35.     string(7) "1 (65C)"
    36.   }
    37.   [7]=>
    38.   array(1) {
    39.     [4]=>
    40.     string(7) "1 (65D)"
    41.   }
    42. }
     
  15. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    я тебе помогу http://phpbeautifier.com/beautify.php
    Код (PHP):
    1. <?php
    2.     308
    3. )
    4.     {
    5.     [0] => array(
    6.         1
    7.     )
    8.         {
    9.         [2] => string(7) "1 (65B)"
    10.         }
    11.  
    12.     [1] => array(
    13.         1
    14.     )
    15.         {
    16.         [2] => string(7) "1 (65B)"
    17.         }
    18.  
    19.     [2] => array(
    20.         1
    21.     )
    22.         {
    23.         [2] => string(7) "1 (65B)"
    24.         }
    25.  
    26.     [3] => array(
    27.         1
    28.     )
    29.         {
    30.         [3] => string(7) "1 (65C)"
    31.         }
    32.  
    33.     [4] => array(
    34.         1
    35.     )
    36.         {
    37.         [3] => string(7) "1 (65C)"
    38.         }
    39.  
    40.     [5] => array(
    41.         1
    42.     )
    43.         {
    44.         [3] => string(7) "1 (65C)"
    45.         }
    46.  
    47.     [6] => array(
    48.         1
    49.     )
    50.         {
    51.         [3] => string(7) "1 (65C)"
    52.         }
    53.  
    54.     [7] => array(
    55.         1
    56.     )
    57.         {
    58.         [4] => string(7) "1 (65D)"
    59.         }
    60.     } 
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.131
    Симпатии:
    1.251
    Адрес:
    там-сям
    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 список уникальных полей".
     
  17. LAlexS

    LAlexS Активный пользователь

    С нами с:
    12 авг 2010
    Сообщения:
    179
    Симпатии:
    0
    Адрес:
    Екатеринбург
    Круто! Я почему-то на автомате написал tp.*, tv.*, ts.* и сразу зациклился, что они тут должны быть, поэтому никак не мог впихнуть DISTINCT, вот и начал к array_unique присматриваться!
    Я невероятно благодарен за помощь!!!