Показать сообщение отдельно
  #24 (permalink)  
Старый 07.04.2015, 13:23
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

array_map это тоже обход массива циклом, просто явно его нет, это встроенная РНР функция написанная на Си.

То что вы используете явный цикл, это не смертельно, но ведь помимо его вам нужны две переменные хранящие количество товара и общую суммы, это операции сложения/умножения в цикле.

У вас рядом с кнопкой Корзина отображается ее краткое описание - количество товара и общая сумма. Следовательно эта информация требуется часто, и ее получать выгоднее как функцией или процедурой. А разве не проще и лаконичнее в таком случае ее код как:
function total_basket($a) {
    return [array_sum(array_map('current', $a)), array_sum(array_map('array_product', $a))];
    //с учтом структуры корзины как описано по ссылке
}

где $a - массив корзины товаров. Можно непосредственно в функции обращаться к корзине, так как $_SESSION, это суперглобальный массив. А так как обращений к корзине будет много, это и добавление товара, и вывод корзины, и ее редактирование, то имя массива можно определить в одном месте через константу, например:
define('BASKET', 'bsk_name');
//и везде при обращениях, включая и внутри функции total_basket
return [array_sum(array_map('current', $_SESSION[BASKET])), array_sum(array_map('array_product', $_SESSION[BASKET]))];

Это гарантия того, что не будет дубликатов имен, или имен переменных и имен в $_SESSION. Если потребуется изменить, это нужно будет сделать только в одном месте.

Массивы, это тип данных с которыми в рамках веб приложения вы будете сталкиваться постоянно. А поэтому крайне желательно знать эти функции, и не просто знать, а уметь ими пользоваться.

А вот отображение корзины, где у вас выводится подробная информация о них, тут уж без цикла не обойтись, но и в этом случае, если вывод, это формирование строки описывающей таблицу, то я бы поступил так:
echo '<form><table><tr>ячейки шапки таблицы</tr>' . implode(array_map(function($k, $v) {
   //return сформированная строка таблицы 
}, array_keys($_SESSION[BASKET]), $_SESSION[BASKET])).'</table><button>Send</button></form>'


В вашей корзине выбор доставки, это два типа, причем только первый имеет цену. Эти типы доставки должны быть прописаны в базе под идентификаторами, сделав запрос по которому можно получить цену 300 или 0, добавив ее к сумме заказа. И делать это надо в сценарии, который оформляет заказ. От клиента требуется только выбранный ID доставки, и получать его надо на той же странице, которая содержит сценарий оформления заказа.

PS. Примеры под РНР не ниже 5.4

Последний раз редактировалось laimas, 07.04.2015 в 14:54.
Ответить с цитированием