За последние 24 часа нас посетили 18563 программиста и 1917 роботов. Сейчас ищут 903 программиста ...

Порядковый номер текущего элемента.

Тема в разделе "PHP для новичков", создана пользователем sv28gs, 31 май 2016.

  1. sv28gs

    sv28gs Новичок

    С нами с:
    31 май 2016
    Сообщения:
    7
    Симпатии:
    0
    Привет! Подскажите, пжлст. Как получить номер текущего элемента в массиве? Пробовал функцию key() но она передает номер первого элемента, т.е. "1".
    PHP:
    1.    
    2. $num = ?
    3.  
    4. $other = Query::findAll("SELECT * FROM tbl_product WHERE categories_id={$_GET[id]} LIMIT $num,5");
    5.  
    6. foreach ($other as $value):
    7.  
    8. echo '<p>'.$value['title'].'</p>';
    9.                
    10. endforeach;
     
  2. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    as $key => $value? o_O
    А ты точно использовал пример использования key из мануала? o_O
    --- Добавлено ---
    https://php.ru/manual/function.key.html
     
  3. sv28gs

    sv28gs Новичок

    С нами с:
    31 май 2016
    Сообщения:
    7
    Симпатии:
    0
    Вобщем, опишу задачу для понимания, есть подобие карточки товара. Нужно вывести на странице 5 следующих товаров из этой же категории. Для этого мне нужно переменной $num передать значение key текущего элемента. Статью эту изучил, но я думаю, что не правильно понимаю, как использовать данную функцию.
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    если числовой индекс сделай через цикл for.
    Не подходит?
     
  5. sv28gs

    sv28gs Новичок

    С нами с:
    31 май 2016
    Сообщения:
    7
    Симпатии:
    0
    Не знаю, как можно цикл for использовать в моем случае, не зря я пишу в "php для новичков". Если правильно понял описание, то цикл for начинает итерацию с первого элемента?
     
  6. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Гы, сделай var_dump($other);
    Какие данные в массиве.
     
  7. sv28gs

    sv28gs Новичок

    С нами с:
    31 май 2016
    Сообщения:
    7
    Симпатии:
    0
    Код (Text):
    1. { [1]=> array(41) {
    2. ["id"]=> string(4) "2533"
    3. ["categories_id"]=> string(3) "218"
    4. ["title"]=> string(35) "Электроды"
    5. ["descriptoin"]=> string(0) ""
    6. ["descriptoin_dop"]=> string(0) ""
    7. ["brand_id"]=> string(3) "102"
    8. ["img_small"]=> string(30) "/img/default/default_small.jpg"
    9. ["img_big"]=> string(28) "/img/default/default_big.jpg"
    10. ["img_bigest"]=> string(0) ""
    11. ["resize_big"]=> string(42) "/uploads/images/big/monolit-mr3ars_big.jpg"
    12. ["resize_mid"]=> string(44) "/uploads/images/midl/monolit-mr3ars_midl.jpg"
    13. ["resize_small"]=> string(46) "/uploads/images/small/monolit-mr3ars_small.jpg"
    14. ["presentation"]=> string(0) ""
    15. ["file"]=> string(0) ""
    16. ["position"]=> string(3) "156"
    17. ["retail_price"]=> string(3) "100"
    18. ["article"]=> string(1) "-"
    19. ["total"]=> string(1) "0"
    20. ["current_type"]=> string(0) ""
    21. ["current_regulation"]=> string(0) ""
    22. ["range_current"]=> string(1) "-"
    23. ["i_current"]=> string(0) ""
    24. ["power"]=> string(1) "-"
    25. ["voltage"]=> string(1) "-"
    26. ["cooling"]=> string(0) ""
    27. ["size"]=> string(0) ""
    28. ["weight"]=> string(1) "1"
    29. ["delivery"]=> string(0) ""
    30. ["diameter"]=> string(0) ""
    31. ["speed"]=> string(0) ""
    32. ["unit"]=> NULL
    33. ["number"]=> string(1) "-"
    34. ["comment"]=> string(1) "-"
    35. ["hidden"]=> string(0) ""
    36. ["related1"]=> string(1) "0"
    37. ["related2"]=> string(1) "0"
    38. ["appoint"]=> string(0) ""
    39. ["kod"]=> string(11) "У30999 "
    40. ["kolichestvo"]=> string(3) "591"
    41. ["stock"]=> string(20) "Склад"
    42. ["ed"]=> string(3) "кг." }
     
  8. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.594
    Симпатии:
    1.764
    Уже подсказали же,
    PHP:
    1. foreach ($other as $key => $value) { /* ... */ }
     
  9. host

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

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    там двухуровневый массив, если сказать жестко то:
    PHP:
    1. foreach ($other[1] as $key => $value) { /* ... */ }
     
  10. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.594
    Симпатии:
    1.764
    host, ему нужны строки таблицы скорее всего, а не по одному элементу строки с индексом 1
     
  11. sv28gs

    sv28gs Новичок

    С нами с:
    31 май 2016
    Сообщения:
    7
    Симпатии:
    0
    В таблице привязаться не к чему. Я думал key() это постоянное значение для каждой строки, а получается, что в цикле он всегда начинается с "1". Или я не прав?
    Повторю, что хочу сделать: есть карточка товара, нужно вывести "еще товары из этой категории"(следующие 5, например). Получается:
    • вывод нескольких товаров (LIMIT 5);
    • вывод, начиная с определенного товара (LIMIT 3,5).
    Мне же нужно в этой строке:
    $other = Query::findAll("SELECT * FROM tbl_product WHERE categories_id={$_GET[id]} LIMIT $start,5")
    Определить переменную $start, как номер текущего товара, чтобы с него начинался отсчет.

    Спасибо за советы и помощь!:)
     
  12. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.594
    Симпатии:
    1.764
    Так ты пагинацию (разбиение на страницы) изобретаешь? Изобретено давно
    PHP:
    1. $offset = ($page_num - 1) * $per_page;
     
  13. sv28gs

    sv28gs Новичок

    С нами с:
    31 май 2016
    Сообщения:
    7
    Симпатии:
    0
    Нет, блок "похожие товары". Если подход не правильный, то направьте хоть)
     
  14. host

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

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    Какая связь LIMIT'a с похожими товарами? o_O
     
  15. sv28gs

    sv28gs Новичок

    С нами с:
    31 май 2016
    Сообщения:
    7
    Симпатии:
    0
    никакая, LIMIT позволяет получить m-элементов, начиная с n-элемента.
    Видел пример, где используется конструкция "LIMIT $start,5", но он для пагинации. Вот переменную $start не могу определить.
     
  16. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Тебе вроде дали совет.
    $offset=($page_num-1)*$per_page;

    Или чет не то? o_O
     
  17. host

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

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    PHP:
    1. foreach ($other as $key => $value) { /* ... */ }
    $key - индекс текущего элемента массива. Без цикла - это утопия.

    В случае пагинации, стартовое значение можно вычислить.
    Определите логически, как можно вычислить ваш индекс (если возможно вообще)
     
  18. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    https://php.ru/manual/ref.array.html

    Вот тебе мануал по функциям для работы с массивами. Там так чётко и классно всё написано :) Нет ну правда я вот например на память ещё не помню всех функций, я постоянно в него смотрю когда хочу что нибудь с массивами делать.


    А для получения текущего индекса массива

    используя key() ты как раз и получаешь номер текущего элемента массива... Но помни что из базы ты получаешь не просто массив. Сделай print_r($array) или var_dump($array) и посмотри что у тебя на выхлопе. А дальше подумай к чему ты применяешь функцию key. Код не может работать не правильно. Он выполняет то что ты ему говоришь.

    А вообще вот тебе код для работы с массивом из базы .

    PHP:
    1.             $result2 = $db->prepare('SELECT
    2.                                    respond_id, request_id,
    3.                                    respond_price, respond_comment,
    4.                                    execute_login, status,
    5.                                    date, user_id,
    6.                                    user_name, user_tel
    7.                                    FROM respond
    8.                                    LEFT JOIN users ON users.user_login=respond.execute_login
    9.                                    WHERE respond_id=:respond_id');
    10.             $result2->bindParam(':respond_id', $resp_id);
    11.             $result2->execute();
    12.  
    13.             if (!empty($result2)) {
    14.                 $resultarr = [];
    15.                 $i = 0;
    16.                 while ($row = $result2->fetch()) {
    17.                     $resultarr[$i]['respond_id'] = $row['respond_id'];
    18.                     $resultarr[$i]['request_id'] = $row['request_id'];
    19.                     $resultarr[$i]['respond_price'] = $row['respond_price'];
    20.                     $resultarr[$i]['respond_comment'] = $row['respond_comment'];
    21.                     $resultarr[$i]['execute_login'] = $row['execute_login'];
    22.                     $resultarr[$i]['status'] = $row['status'];
    23.                     $resultarr[$i]['date'] = $row['date'];
    24.                     $resultarr[$i]['user_id'] = $row['user_id'];
    25.                     $resultarr[$i]['user_name'] = $row['user_name'];
    26.                     $resultarr[$i]['user_tel'] = $row['user_tel'];
    27.                     $i++;
    28.                 }
    29.                 return $resultarr;
    30.             } else {
    31.                 $result = 'Новых уведомлений нет';
    32.                 return $result;
    33.             }
     
  19. host

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

    С нами с:
    20 июн 2007
    Сообщения:
    733
    Симпатии:
    3
    @askanim если бы нужно было получить 50 столбцов, вы бы их тоже так прописывали вручную?
     
  20. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Это пример! Жаль не подписал... А вообще можно ассоциативный массив, и прогнать циклом, но так как у меня не 50 столбцов! Я прописал их вручную. Потому, что не вижу смысла гонять циклы тут.
    PHP:
    1. $arr = [];
    2. foreach ($arrayDB as $key => $value) {
    3.     foreach($value as $k => $v)
    4.     {
    5.         $arr[$value][$k]= $v;
    6.     }
    7. };
    Как то так можно
     
    #20 askanim, 1 июн 2016
    Последнее редактирование: 1 июн 2016
  21. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.594
    Симпатии:
    1.764
    Если это похожие товары, то для начала определись, что для тебя похожие товары.

    @askanim,
    PHP:
    1. while ($row = $result2->fetch())   {
    2.      $resultarr[] = $row;
    3. }
    И всех делов. Вы, наверное, кода open cart начитались, там любят перегонять из пустого в порожнее
     
  22. askanim

    askanim Старожил

    С нами с:
    7 апр 2016
    Сообщения:
    2.201
    Симпатии:
    166
    Адрес:
    GABRIEL
    Я всего лишь привёл примеры обычные. Самые стандартные, чтобы было понятно, что и куда, а как уже реализовывать, каждый сам выбирает. Движки для написания вообще не использую, только framework иногда.