LINUX.ORG.RU

Оптимизировать по-доброму

 , , ,


0

1

Привет!

Как мне сказали на StackOverflow с таким кодом нужно уже писать не к ним, а на codereview.stackexchange.com. Но мне все-таки кажется, что на ЛОРе мне ответят быстрее и содержательнее.

Короче говоря, как можно улучшить вот такой код

<?php
error_reporting(E_ALL);
require_once('app/Mage.php');
Mage::init();
Mage::getSingleton("core/session", array("name" => "frontend"));
$productList = array(
array(),
array(),
array()
);
$count = Mage::getSingleton('checkout/session')->getQuote()->getItemsQty();
$cart = Mage::getSingleton('checkout/session')->getQuote()->getAllItems();
$name = array();
$qty = array();
$price = array();
for ($i = 0; $i < $count; $i++) {
     $name[$i] = $cart[$i]->getProduct()->getName();
     $qty[$i] = $cart[$i]->getQty();
     $price[$i] = $cart[$i]->getProduct()->getPrice();
     $productList[$i] = array(
                              $name[$i],
                              $qty[$i],
                              $price[$i]
                                        );
    }
print_r($productList);

Что сделать, чтобы как можно меньше страдать извращениями с массивами? Сделать его короче, чище, прекраснее, насколько это возможно на php.

Собственно сам сформированный массив $productList мне нужно дальше передавать в другой php класс.

Спасибо, други!

★★★★★

Последнее исправление: Twissel (всего исправлений: 2)

быстрофикс от индуса :-)

<?php
error_reporting(E_ALL);
require_once('app/Mage.php');

Mage::init();
Mage::getSingleton("core/session", array("name" => "frontend"));

$count = Mage::getSingleton('checkout/session')->getQuote()->getItemsQty();
$cart = Mage::getSingleton('checkout/session')->getQuote()->getAllItems();

$productList = [[], [], []];
$name = $qty = $price = [];
$i = 0;
for ($i; $i < $count; $i++) {
    $name[$i] = $cart[$i]->getProduct()->getName();
    $qty[$i] = $cart[$i]->getQty();
    $price[$i] = $cart[$i]->getProduct()->getPrice();

    $productList[$i] = [$name[$i], $qty[$i], $price[$i]];
}

print_r($productList);
Twissel ★★★★★
() автор топика

И да, на правах офтопа, я замечаю, что SO, в отличие от ЛОРа, погряз в «бюрократии» и индусах.

Печально.

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)

Дисклеймер: не знаю php вообще

Зачем тебе 3 вспомогательных массива вместо трёх переменных, если ты их не пользуешь?

Почему не сделать foreach по $cart вместо пляски с for и $count?

Почему бы не $productList = []; ?

И вообще, разве в этом вашем php нет map?

Туда вроде завозили и comprehension'ы, но я не уверен, что они будут работать с этими getAllItems() (это массив?) и будут более читаемы, чем foreach.

x3al ★★★★★
()
<?php
error_reporting(E_ALL);
require_once("app/Mage.php");

Mage::init();
Mage::getSingleton("core/session", array("name" => "frontend"));

$productList = array();
$cart = Mage::getSingleton("checkout/session")->getQuote()->getAllItems();

foreach($cart as $item) {
	$productList[] = array(
		$item->getProduct()->getName(),
		$item->getQty(),
		$item->getProduct()->getPrice()
	);
}

print_r($productList);
Deleted
()
Ответ на: быстрофикс от индуса :-) от Twissel

держи еще вариант говнокода %)

<?php
error_reporting(E_ALL);
require_once("app/Mage.php");

function setData($acc, $item)
{
	$acc[] = [
		$item->getProduct()->getName(),
		$item->getQty(),
		$item->getProduct()->getPrice()
	];
	return $acc;
}

Mage::init();
Mage::getSingleton("core/session", ["name" => "frontend"]);
print_r(array_reduce(Mage::getSingleton("checkout/session")->getQuote()->getAllItems(), "setData", []));
Noob_Linux ★★★★
()
Ответ на: комментарий от Noob_Linux

Дело в том, что при использовании foreach количество товара, равно как и общая стоимость заказа, не соответствует действительности.

Например, в корзине 2 единицы товара по цене 210 у.е. за единицу и 3 единицы товара по цене 455 у.е. за штуку.

Результирующий массив

Array ( [0] => Array ( [0] => Merino V-neck Pullover Sweater [1] => 2 [2] => 210.0000 ) [1] => Array ( [0] => Merino V-neck Pullover Sweater [1] => 1 [2] => 210.0000 ) [2] => Array ( [0] => Linen Blazer [1] => 3 [2] => 455.0000 ) [3] => Array ( [0] => Linen Blazer [1] => 1 [2] => 455.0000 ) ) 

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 2)
Ответ на: комментарий от Noob_Linux

Хотя суть понятна, остальное исправим.

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

Дай мне

var_dump(Mage::getSingleton('checkout/session')->getQuote()->getItemsQty());
var_dump(Mage::getSingleton('checkout/session')->getQuote()->getAllItems());

мне кажется я уже знаю в чем причина.

Noob_Linux ★★★★
()
Ответ на: Это Мадженто! от Twissel

За чем мне это? я просил тебя дать дампы массивов которые ты пытаешь обработать.

$count = Mage::getSingleton('checkout/session')->getQuote()->getItemsQty();
$cart = Mage::getSingleton('checkout/session')->getQuote()->getAllItems();

вот их. Зачем не дамп объекта?

Noob_Linux ★★★★
()
Ответ на: комментарий от Noob_Linux

В том и суть, что это дамп объекта в Мадженто :-D

Оверинжиниринг, однако!

Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

Етить, я уже понял что это.

Ладно, давай тогда так. Что выдаст это?

echo count(Mage::getSingleton('checkout/session')->getQuote()->getAllItems()) , ' = ', Mage::getSingleton('checkout/session')->getQuote()->getItemsQty(), PHP_EOL;

Noob_Linux ★★★★
()
Последнее исправление: Noob_Linux (всего исправлений: 1)
Ответ на: комментарий от Noob_Linux

Еще один фикс от индуса. Он, по крайней мере обнуляет цену у дублей.

<?php
error_reporting(E_ALL);
require_once('app/Mage.php');
Mage::init();

Mage::getSingleton("core/session", array("name" => "frontend"));
$productList = array();

$quote = Mage::getSingleton('checkout/session')->getQuote();

foreach ($quote->getAllItems() as $item) {
    $productList[]=array($item->getName(),$item->getQty(),$item->getPrice());
}
Twissel ★★★★★
() автор топика
Ответ на: комментарий от Twissel

Думаю тебе все таки стоит разобраться почему Mage::getSingleton('checkout/session')->getQuote()->getAllItems(); возвращает тебе не 2 объекта а 4. Откуда берутся эти дубли?

Noob_Linux ★★★★
()
Ответ на: комментарий от Noob_Linux

Надо было ставить Linux вызывать getAllVisibleItems()

error_reporting(E_ALL);
require_once("app/Mage.php");

function setData($acc, $item)
{
	$acc[] = [
		$item->getProduct()->getName(),
		$item->getQty(),
		$item->getProduct()->getPrice()
	];
	return $acc;
}

Mage::init();
Mage::getSingleton("core/session", ["name" => "frontend"]);
print_r(array_reduce(Mage::getSingleton("checkout/session")->getQuote()->getAllVisibleItems(), "setData", []));

Спасибо за помощь!

Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)
Ответ на: комментарий от Noob_Linux

Тогда всё сходится

echo count(Mage::getSingleton('checkout/session')->getQuote()->getAllVisibleItems()) , ' different products in the amount of ', Mage::getSingleton('checkout/session')->getQuote()->getItemsQty(), ' pieces ',PHP_EOL;
Twissel ★★★★★
() автор топика
Последнее исправление: Twissel (всего исправлений: 1)
Ответ на: комментарий от Twissel

Добавь два одинаковых товара но не группируй.
Когда гуглил где-то мельком прочитал что getAllVisibleItems выдаст только один товар.

Deleted
()
Ответ на: комментарий от Deleted

не группируй.

Не понял, что ты имел ввиду. Меня интересует только три характеристики товара: имя, количество и цена. В случае нескольких одинаковых товаров все правильно отображается через getAllVisibleItems

http://magento.stackexchange.com/a/78325/44913

Twissel ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.