2

I know that this is asked before, I even tryied to do as on this question: How to Sort Multi-dimensional Array by Value?

But in my case it doesn't work. If anybody can help me I will be very thankful.

My code:

$product_var_tpl = array(


                        'name' => $product['name'].(isset($product['attributes']) ? ' - '.$product['attributes'] : ''),
                        'unit_price' => Tools::displayPrice($product_price, $this->context->currency, false),
                        'price' => Tools::displayPrice($product_price * $product['quantity'], $this->context->currency, false),
                        'quantity' => $product['quantity'],
                        'reference' => $seller_name,
                        'customization' => array()

                    );

I want to sort this array by "reference" in alphabetical order.

I tried this:

usort($product_var_tpl, function($a, $b) {
    return $a['reference'] - $b['reference'];
});

But the result is null or empty.

By default the output is:

Referance     |   Product name | Unite price |  Qty  |  Price

testshop2     |   pere         | 42,00       |  0.5  | 21,00 
testshoptwo   |   portocale    | 21,00       |  1    | 21,00     
irinatestshop |   qiwi         | 34,00       |  0.5  | 17,00 
irinatestshop |   Banane       | 12,00       | 1     | 12,00 

If I use "usort" I only get 4 empty rows

This si the full code:

// Construct order detail table for the email
                    $products_list = '';
                    $virtual_product = true;

                    $product_var_tpl_list = array();
                    foreach ($order->product_list as $product) {
                        $price = Product::getPriceStatic((int)$product['id_product'], false, ($product['id_product_attribute'] ? (int)$product['id_product_attribute'] : null), 6, null, false, true, $product['cart_quantity'], false, (int)$order->id_customer, (int)$order->id_cart, (int)$order->{Configuration::get('PS_TAX_ADDRESS_TYPE')});
                        $price_wt = Product::getPriceStatic((int)$product['id_product'], true, ($product['id_product_attribute'] ? (int)$product['id_product_attribute'] : null), 2, null, false, true, $product['cart_quantity'], false, (int)$order->id_customer, (int)$order->id_cart, (int)$order->{Configuration::get('PS_TAX_ADDRESS_TYPE')});

                        $product_price = Product::getTaxCalculationMethod() == PS_TAX_EXC ? Tools::ps_round($price, 2) : $price_wt;

                        //aici se pune date despre vinzaor
                        $idProduct = (int)$product['id_product'];
                        $SellerInfoOverride = Db::getInstance()->executeS('SELECT * FROM `'._DB_PREFIX_.'wk_mp_seller_product`  WHERE `id_ps_product` = '.(int) $idProduct);
                        //print_r ($SellerInfoOverride);
                        foreach ($SellerInfoOverride as $key => $value) {
                            $sellerid = $value['id_seller'];
                            //$seller = $mpSeller->getSeller($value['id_seller'], $this->context->language->id);
                            $SellerInfoDetails = Db::getInstance()->executeS('SELECT * FROM `'._DB_PREFIX_.'wk_mp_seller`  WHERE `id_seller` = '.(int) $sellerid);
                            foreach ($SellerInfoDetails as $key => $value) {
                                $seller_name = $value['shop_name_unique'];
                            }
                        }

                        $product_var_tpl = array(


                            'name' => $product['name'].(isset($product['attributes']) ? ' - '.$product['attributes'] : ''),
                            'unit_price' => Tools::displayPrice($product_price, $this->context->currency, false),
                            'price' => Tools::displayPrice($product_price * $product['quantity'], $this->context->currency, false),
                            'quantity' => $product['quantity'],
                            'reference' => $seller_name,
                            'customization' => array()

                        );
                        usort($product_var_tpl, function($a, $b) {
                            return $a['reference'] - $b['reference'];
                        });

                        $customized_datas = Product::getAllCustomizedDatas((int)$order->id_cart);
                        if (isset($customized_datas[$product['id_product']][$product['id_product_attribute']])) {
                            $product_var_tpl['customization'] = array();
                            foreach ($customized_datas[$product['id_product']][$product['id_product_attribute']][$order->id_address_delivery] as $customization) {
                                $customization_text = '';
                                if (isset($customization['datas'][Product::CUSTOMIZE_TEXTFIELD])) {
                                    foreach ($customization['datas'][Product::CUSTOMIZE_TEXTFIELD] as $text) {
                                        $customization_text .= $text['name'].': '.$text['value'].'<br />';
                                    }
                                }

                                if (isset($customization['datas'][Product::CUSTOMIZE_FILE])) {
                                    $customization_text .= sprintf(Tools::displayError('%d image(s)'), count($customization['datas'][Product::CUSTOMIZE_FILE])).'<br />';
                                }

                                $customization_quantity = (int)$product['customization_quantity'];

                                $product_var_tpl['customization'][] = array(
                                    'customization_text' => $customization_text,
                                    'customization_quantity' => $customization_quantity,
                                    'quantity' => Tools::displayPrice($customization_quantity * $product_price, $this->context->currency, false)
                                );
                            }
                        }

                        $product_var_tpl_list[] = $product_var_tpl;
                        // Check if is not a virutal product for the displaying of shipping
                        if (!$product['is_virtual']) {
                            $virtual_product &= false;
                        }
                    } // end foreach ($products)
10
  • 4
    Your array is an associative array with one reference key. How did you expect to have multiple reference keys? What is the expected output for the input you have given? Commented Jun 13, 2020 at 20:43
  • what do you want to sort here? isn't $product_var_tpl just an item? What are the input and the expected output? Commented Jun 13, 2020 at 21:08
  • I have edited my question Commented Jun 13, 2020 at 21:20
  • Your $product_var_tpl is simple array variable. Do you mean you want to sort the array of product_var_tpl? Commented Jun 13, 2020 at 21:22
  • Yes, I want to sort the output of it Commented Jun 13, 2020 at 21:23

1 Answer 1

3

Please sort $product_var_tpl_list, not $product_var_tpl.

Following is sample code.

$array = array(       // $product_var_tpl_list
        array(        // $product_var_tpl 1
            'name' => 'b',
            'reference' => 'bbb'
            ),
        array(        // $product_var_tpl 2
            'name' => 'a',
            'reference' => 'aaa'
            ),
        array(        // $product_var_tpl 3
            'name' => 'd',
            'reference' => 'ddd'
            ),
        array(        // $product_var_tpl 4
            'name' => 'c',
            'reference' => 'ccc'
            ),
        array(        // $product_var_tpl 5
            'name' => 'e',
            'reference' => 'eee'
            ),
        array(        // $product_var_tpl 6
            'name' => 'a',
            'reference' => 'www'
            )
    );

usort($array, function($a, $b) {
    return strcmp($a['reference'], $b['reference']);
});

print_r($array);

And test result is as following.

Array
(
    [0] => Array
        (
            [name] => a
            [reference] => aaa
        )

    [1] => Array
        (
            [name] => b
            [reference] => bbb
        )

    [2] => Array
        (
            [name] => c
            [reference] => ccc
        )

    [3] => Array
        (
            [name] => d
            [reference] => ddd
        )

    [4] => Array
        (
            [name] => e
            [reference] => eee
        )

    [5] => Array
        (
            [name] => a
            [reference] => www
        )

)
Sign up to request clarification or add additional context in comments.

1 Comment

Use return strcmp($a['reference'], $b['reference']) instead - returning false (0) means the values are considered equal and not that one should be sorted before the other. This may break the order under certain conditions.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.