Привет! Подскажите, пжлст. Как получить номер текущего элемента в массиве? Пробовал функцию key() но она передает номер первого элемента, т.е. "1". PHP: $num = ? $other = Query::findAll("SELECT * FROM tbl_product WHERE categories_id={$_GET[id]} LIMIT $num,5"); foreach ($other as $value): echo '<p>'.$value['title'].'</p>'; endforeach;
as $key => $value? А ты точно использовал пример использования key из мануала? --- Добавлено --- https://php.ru/manual/function.key.html
Вобщем, опишу задачу для понимания, есть подобие карточки товара. Нужно вывести на странице 5 следующих товаров из этой же категории. Для этого мне нужно переменной $num передать значение key текущего элемента. Статью эту изучил, но я думаю, что не правильно понимаю, как использовать данную функцию.
Не знаю, как можно цикл for использовать в моем случае, не зря я пишу в "php для новичков". Если правильно понял описание, то цикл for начинает итерацию с первого элемента?
Код (Text): { [1]=> array(41) { ["id"]=> string(4) "2533" ["categories_id"]=> string(3) "218" ["title"]=> string(35) "Электроды" ["descriptoin"]=> string(0) "" ["descriptoin_dop"]=> string(0) "" ["brand_id"]=> string(3) "102" ["img_small"]=> string(30) "/img/default/default_small.jpg" ["img_big"]=> string(28) "/img/default/default_big.jpg" ["img_bigest"]=> string(0) "" ["resize_big"]=> string(42) "/uploads/images/big/monolit-mr3ars_big.jpg" ["resize_mid"]=> string(44) "/uploads/images/midl/monolit-mr3ars_midl.jpg" ["resize_small"]=> string(46) "/uploads/images/small/monolit-mr3ars_small.jpg" ["presentation"]=> string(0) "" ["file"]=> string(0) "" ["position"]=> string(3) "156" ["retail_price"]=> string(3) "100" ["article"]=> string(1) "-" ["total"]=> string(1) "0" ["current_type"]=> string(0) "" ["current_regulation"]=> string(0) "" ["range_current"]=> string(1) "-" ["i_current"]=> string(0) "" ["power"]=> string(1) "-" ["voltage"]=> string(1) "-" ["cooling"]=> string(0) "" ["size"]=> string(0) "" ["weight"]=> string(1) "1" ["delivery"]=> string(0) "" ["diameter"]=> string(0) "" ["speed"]=> string(0) "" ["unit"]=> NULL ["number"]=> string(1) "-" ["comment"]=> string(1) "-" ["hidden"]=> string(0) "" ["related1"]=> string(1) "0" ["related2"]=> string(1) "0" ["appoint"]=> string(0) "" ["kod"]=> string(11) "У30999 " ["kolichestvo"]=> string(3) "591" ["stock"]=> string(20) "Склад" ["ed"]=> string(3) "кг." }
там двухуровневый массив, если сказать жестко то: PHP: foreach ($other[1] as $key => $value) { /* ... */ }
В таблице привязаться не к чему. Я думал key() это постоянное значение для каждой строки, а получается, что в цикле он всегда начинается с "1". Или я не прав? Повторю, что хочу сделать: есть карточка товара, нужно вывести "еще товары из этой категории"(следующие 5, например). Получается: вывод нескольких товаров (LIMIT 5); вывод, начиная с определенного товара (LIMIT 3,5). Мне же нужно в этой строке: $other = Query::findAll("SELECT * FROM tbl_product WHERE categories_id={$_GET[id]} LIMIT $start,5") Определить переменную $start, как номер текущего товара, чтобы с него начинался отсчет. Спасибо за советы и помощь!
Так ты пагинацию (разбиение на страницы) изобретаешь? Изобретено давно PHP: $offset = ($page_num - 1) * $per_page;
никакая, LIMIT позволяет получить m-элементов, начиная с n-элемента. Видел пример, где используется конструкция "LIMIT $start,5", но он для пагинации. Вот переменную $start не могу определить.
PHP: foreach ($other as $key => $value) { /* ... */ } $key - индекс текущего элемента массива. Без цикла - это утопия. В случае пагинации, стартовое значение можно вычислить. Определите логически, как можно вычислить ваш индекс (если возможно вообще)
https://php.ru/manual/ref.array.html Вот тебе мануал по функциям для работы с массивами. Там так чётко и классно всё написано Нет ну правда я вот например на память ещё не помню всех функций, я постоянно в него смотрю когда хочу что нибудь с массивами делать. А для получения текущего индекса массива используя key() ты как раз и получаешь номер текущего элемента массива... Но помни что из базы ты получаешь не просто массив. Сделай print_r($array) или var_dump($array) и посмотри что у тебя на выхлопе. А дальше подумай к чему ты применяешь функцию key. Код не может работать не правильно. Он выполняет то что ты ему говоришь. А вообще вот тебе код для работы с массивом из базы . PHP: $result2 = $db->prepare('SELECT respond_id, request_id, respond_price, respond_comment, execute_login, status, date, user_id, user_name, user_tel FROM respond LEFT JOIN users ON users.user_login=respond.execute_login WHERE respond_id=:respond_id'); $result2->bindParam(':respond_id', $resp_id); $result2->execute(); if (!empty($result2)) { $resultarr = []; $i = 0; while ($row = $result2->fetch()) { $resultarr[$i]['respond_id'] = $row['respond_id']; $resultarr[$i]['request_id'] = $row['request_id']; $resultarr[$i]['respond_price'] = $row['respond_price']; $resultarr[$i]['respond_comment'] = $row['respond_comment']; $resultarr[$i]['execute_login'] = $row['execute_login']; $resultarr[$i]['status'] = $row['status']; $resultarr[$i]['date'] = $row['date']; $resultarr[$i]['user_id'] = $row['user_id']; $resultarr[$i]['user_name'] = $row['user_name']; $resultarr[$i]['user_tel'] = $row['user_tel']; $i++; } return $resultarr; } else { $result = 'Новых уведомлений нет'; return $result; }
Это пример! Жаль не подписал... А вообще можно ассоциативный массив, и прогнать циклом, но так как у меня не 50 столбцов! Я прописал их вручную. Потому, что не вижу смысла гонять циклы тут. PHP: $arr = []; foreach ($arrayDB as $key => $value) { foreach($value as $k => $v) { $arr[$value][$k]= $v; } }; Как то так можно
Если это похожие товары, то для начала определись, что для тебя похожие товары. @askanim, PHP: while ($row = $result2->fetch()) { $resultarr[] = $row; } И всех делов. Вы, наверное, кода open cart начитались, там любят перегонять из пустого в порожнее
Я всего лишь привёл примеры обычные. Самые стандартные, чтобы было понятно, что и куда, а как уже реализовывать, каждый сам выбирает. Движки для написания вообще не использую, только framework иногда.