John Davidson

php - Sorting rules for null/zero values

0 comments
Message:


This PHP code sorts the items by price (ascending / descending), but there are items in the list with zero price ("Price on request") and need to be displayed at the end.


The question is: how can this be done?


$sort = $this->_getParam('sort');
$sort = $sort === 'ordr' ? '' : $sort;
$sort_type = $this->_getParam('sort_type');

f ($sort) {
if ($sort_type == 'desc') {
$products->setOrderField('price DESC');
} else {
$products->setOrderField('price ASC');
}
}

There is also the old code:


$products->setOrderField(($sort == 'price' || $sort == 'price_param' ? 'isprice desc, price_param' : $sort) . ' ' . $sort_type);

But, but it gives an error:




An error occurred
Exception information:
Message: Select query cannot join with another table

Stack trace:
#0 /var/www/u0221427/data/www/irice.ru/library/Zend/Db/Adapter/Abstract.php(468): Zend_Db_Table_Select->assemble()
#1 /var/www/u0221427/data/www/irice.ru/library/Zend/Db/Adapter/Pdo/Abstract.php(238): Zend_Db_Adapter_Abstract->query(Object(Zend_Db_Table_Select), Array)
#2 /var/www/u0221427/data/www/irice.ru/library/Zend/Db/Table/Abstract.php(1577): Zend_Db_Adapter_Pdo_Abstract->query(Object(Zend_Db_Table_Select))
#3 /var/www/u0221427/data/www/irice.ru/library/Zend/Db/Table/Abstract.php(1392): Zend_Db_Table_Abstract->_fetch(Object(Zend_Db_Table_Select))
#4 /var/www/u0221427/data/www/irice.ru/application/models/mappers/EntityMapper.php(140): Zend_Db_Table_Abstract->fetchAll(Object(Zend_Db_Table_Select))
#5 /var/www/u0221427/data/www/irice.ru/application/models/mappers/EntityMapper.php(61): A_Model_Mapper_EntityMapper->doFindAllBy(Array, Array)
#6 /var/www/u0221427/data/www/irice.ru/application/models/collections/AbstractCollection.php(65): A_Model_Mapper_EntityMapper->__call('doFindAllBy', Array)
#7 /var/www/u0221427/data/www/irice.ru/application/models/collections/AbstractCollection.php(83): A_Model_Collection_AbstractCollection->notifyAccess()
#8 /var/www/u0221427/data/www/irice.ru/application/models/collections/AbstractCollection.php(94): A_Model_Collection_AbstractCollection->getRow(0)
#9 /var/www/u0221427/data/www/irice.ru/application/models/collections/AbstractCollection.php(117): A_Model_Collection_AbstractCollection->current()
#10 /var/www/u0221427/data/www/irice.ru/application/views/scripts/catalog/list.phtml(2): A_Model_Collection_AbstractCollection->valid()
#11 /var/www/u0221427/data/www/irice.ru/application/views/scripts/catalog/view.phtml(212): include('/var/www/u02214...')
#12 /var/www/u0221427/data/www/irice.ru/library/Zend/View.php(157): include('/var/www/u02214...')
#13 /var/www/u0221427/data/www/irice.ru/library/Zend/View/Abstract.php(888): Zend_View->_run('/var/www/u02214...')
#14 /var/www/u0221427/data/www/irice.ru/library/Zend/Controller/Action/Helper/ViewRenderer.php(912): Zend_View_Abstract->render(NULL)
#15 /var/www/u0221427/data/www/irice.ru/library/Zend/Controller/Action/Helper/ViewRenderer.php(933): Zend_Controller_Action_Helper_ViewRenderer->renderScript('catalog/view.ph...', NULL)
#16 /var/www/u0221427/data/www/irice.ru/library/Zend/Controller/Action/Helper/ViewRenderer.php(972): Zend_Controller_Action_Helper_ViewRenderer->render()
#17 /var/www/u0221427/data/www/irice.ru/library/Zend/Controller/Action/HelperBroker.php(277): Zend_Controller_Action_Helper_ViewRenderer->postDispatch()
#18 /var/www/u0221427/data/www/irice.ru/library/Zend/Controller/Action.php(527): Zend_Controller_Action_HelperBroker->notifyPostDispatch()
#19 /var/www/u0221427/data/www/irice.ru/library/Zend/Controller/Dispatcher/Standard.php(308): Zend_Controller_Action->dispatch('viewAction')
#20 /var/www/u0221427/data/www/irice.ru/library/Zend/Controller/Front.php(954): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
#21 /var/www/u0221427/data/www/irice.ru/library/Zend/Application/Bootstrap/Bootstrap.php(105): Zend_Controller_Front->dispatch()
#22 /var/www/u0221427/data/www/irice.ru/library/Zend/Application.php(384): Zend_Application_Bootstrap_Bootstrap->run()
#23 /var/www/u0221427/data/www/irice.ru/index.php(55): Zend_Application->run()
#24 {main}
Request Parameters:


Fatal error: Uncaught Error: Call to a member function getParams() on array in /var/www/u0221427/data/www/irice.ru/application/views/scripts/error/error.phtml:23
Stack trace:
#0 /var/www/u0221427/data/www/irice.ru/library/Zend/View.php(157): include()
#1 /var/www/u0221427/data/www/irice.ru/library/Zend/View/Abstract.php(888): Zend_View->_run('/var/www/u02214...')
#2 /var/www/u0221427/data/www/irice.ru/library/Zend/Controller/Action/Helper/ViewRenderer.php(912): Zend_View_Abstract->render(NULL)
#3 /var/www/u0221427/data/www/irice.ru/library/Zend/Controller/Action/Helper/ViewRenderer.php(933): Zend_Controller_Action_Helper_ViewRenderer->renderScript('error/error.pht...', NULL)
#4 /var/www/u0221427/data/www/irice.ru/library/Zend/Controller/Action/Helper/ViewRenderer.php(972): Zend_Controller_Action_Helper_ViewRenderer->render()
#5 /var/www/u0221427/data/www/irice.ru/library/Zend/Controller/Action/HelperBroker.php(277): Zend_Controller_Action_Helper_ViewRenderer->postDispatch()
#6 /var/www/u0221427/data/www/irice.ru/library/Z in /var/www/u0221427/data/www/irice.ru/application/views/scripts/error/error.phtml on line 23


My Answer:
0) or null values. How can we modify the code to handle these cases properly?

php
// Sample array of items with prices
$items = [
['name' => 'Item A', 'price' => 10],
['name' => 'Item B', 'price' => 0],
['name' => 'Item C', 'price' => null],
['name' => 'Item D', 'price' => 5],
];

// Sort items by price in ascending order
usort($items, function($a, $b) {
if ($a['price'] === null && $b['price'] === null) {
return 0;
} elseif ($a['price'] === null) {
return 1;
} elseif ($b['price'] === null) {
return -1;
} elseif ($a['price'] == 0 && $b['price'] == 0) {
return 0;
} elseif ($a['price'] == 0) {
return 1;
} elseif ($b['price'] == 0) {
return -1;
} else {
return $a['price'] - $b['price'];
}
});

// Print sorted items
foreach ($items as $item) {
echo $item['name'] . ' - ' . $item['price'] . PHP_EOL;
}


In this modified code, we handle null and zero price values separately by checking for them before comparing the prices. Null values are considered greater than zero prices, and zero prices are considered greater than null values. This ensures that the sorting is done correctly with respect to null and zero values.

Rate this post

5 of 5 based on 6590 votes

Comments




© 2024 Hayatsk.info - Personal Blogs Platform. All Rights Reserved.
Create blog  |  Privacy Policy  |  Terms & Conditions  |  Contact Us