0

I have been trying to use array_multisort() but its not working correctly.

I have 2 arrays set up:

$sortArr = array(); // array used for sorting by price
$optionsArray = array();

I then aim to sort the $optionsArray using the price by doing:

array_multisort($sortArr, SORT_DESC, $optionsArray);

The issue is that the order of the results do change, but not correctly. The example I have used is actually quite close but others are nowhere near.

When var dumping the arrays AFTER using array_multisort I get:

($sortArr):

 array(8) { 
   [0]=> object(SimpleXMLElement)#61 (1) { [0]=> string(3) "610" } 
   [1]=> object(SimpleXMLElement)#66 (1) { [0]=> string(3) "300" } 
   [2]=> object(SimpleXMLElement)#71 (1) { [0]=> string(3) "235" } 
   [3]=> object(SimpleXMLElement)#56 (1) { [0]=> string(1) "0" } 
   [4]=> object(SimpleXMLElement)#51 (1) { [0]=> string(3) "135" } 
   [5]=> object(SimpleXMLElement)#41 (1) { [0]=> string(1) "0" } 
   [6]=> object(SimpleXMLElement)#46 (1) { [0]=> string(1) "0" } 
   [7]=> object(SimpleXMLElement)#36 (1) { [0]=> string(1) "0" } 
 }

($optionsArray):

 array(8) { 
   [0]=> array(4) { 
      ["shortdesc"]=> object(SimpleXMLElement)#60 (1) { 0]=> string(14) "Metallic paint" } 
      ["longdesc"]=> object(SimpleXMLElement)#54 (1) { [0]=> string(14) "Metallic paint" } 
      ["price"]=> object(SimpleXMLElement)#61 (1) { [0]=> string(3) "610" } 
      ["kind"]=> object(SimpleXMLElement)#62 (1) { [0]=> string(8) "Optional" } } 
   [1]=> array(4) { 
      ["shortdesc"]=> object(SimpleXMLElement)#65 (1) { [0]=> string(43) "Seat heating for driver and front passenger" } 
      ["longdesc"]=> object(SimpleXMLElement)#59 (1) { [0]=> string(33) "Driver and passenger seat: heated" } 
      ["price"]=> object(SimpleXMLElement)#66 (1) { [0]=> string(3) "300" } 
      ["kind"]=> object(SimpleXMLElement)#67 (1) { [0]=> string(8) "Optional" } } 
   [2]=> array(4) { 
      ["shortdesc"]=> object(SimpleXMLElement)#70 (1) { [0]=> string(20) "Sun protection glass" } 
      ["longdesc"]=> object(SimpleXMLElement)#64 (1) { [0]=> string(61) "Privacy glass on the rear window and on the rear side windows" } 
      ["price"]=> object(SimpleXMLElement)#71 (1) { [0]=> string(3) "235" } 
      ["kind"]=> object(SimpleXMLElement)#72 (1) { [0]=> string(8) "Optional" } } 
   [3]=> array(4) { 
      ["shortdesc"]=> object(SimpleXMLElement)#55 (1) { [0]=> string(23) "Glacier Silver metallic" } 
      ["longdesc"]=> object(SimpleXMLElement)#49 (1) { [0]=> string(23) "External colour: silver" } 
      ["price"]=> object(SimpleXMLElement)#56 (1) { [0]=> string(1) "0" } 
      ["kind"]=> object(SimpleXMLElement)#57 (1) { [0]=> string(8) "Optional" } } 
   [4]=> array(4) { 
      ["shortdesc"]=> object(SimpleXMLElement)#50 (1) { [0]=> string(16) "Extended storage" } 
      ["longdesc"]=> object(SimpleXMLElement)#44 (1) { [0]=> string(243) "2 x 12v power outlet located in rear section, Seat back storage: pockets behind front seats, Versatile net, Storage net on left in luggage compartment, Two extra lashing eyes in luggage compartment, Retaining strap on right luggage compartment" } 
      ["price"]=> object(SimpleXMLElement)#51 (1) { [0]=> string(3) "135" } 
      ["kind"]=> object(SimpleXMLElement)#52 (1) { [0]=> string(8) "Optional" } } 
   [5]=> array(4) { 
      ["shortdesc"]=> object(SimpleXMLElement)#40 (1) { [0]=> string(31) "Brushed Aluminium interior trim" } 
      ["longdesc"]=> object(SimpleXMLElement)#29 (1) { [0]=> string(109) "Alloy look trim on dashboard, alloy look trim on doors and alloy look trim on centre console, Alloy dashboard" } 
      ["price"]=> object(SimpleXMLElement)#41 (1) { [0]=> string(1) "0" } 
      ["kind"]=> object(SimpleXMLElement)#42 (1) { [0]=> string(8) "Optional" } } 
   [6]=> array(4) { 
      ["shortdesc"]=> object(SimpleXMLElement)#45 (1) { [0]=> string(22) "Dakota Leather - Black" } 
      ["longdesc"]=> object(SimpleXMLElement)#39 (1) { [0]=> string(61) "Leather and leather seat upholstery, Upholstery colour: black" } 
      ["price"]=> object(SimpleXMLElement)#46 (1) { [0]=> string(1) "0" } 
      ["kind"]=> object(SimpleXMLElement)#47 (1) { [0]=> string(8) "Optional" } } 
   [7]=> array(4) { 
      ["shortdesc"]=> object(SimpleXMLElement)#35 (1) { [0]=> string(17) "Brushed Aluminium" } 
      ["longdesc"]=> object(SimpleXMLElement)#34 (1) { [0]=> string(77) "Alloy trim on dashboard, alloy trim on doors and alloy trim on centre console" } 
      ["price"]=> object(SimpleXMLElement)#36 (1) { [0]=> string(1) "0" } 
      ["kind"]=> object(SimpleXMLElement)#37 (1) { [0]=> string(8) "Optional" } } 
  }

The arrays are created using this:

foreach ($options as $key => $option) { // create the array for the options
  if ($option->OptionKind != 'Standard') {
    $longDesc = $option->LongDescription;
    $shortDesc = $option->ShortDescription;
    $optionPrice = $option->Price;
    $optionType = $option->OptionKind;
    $optionsArray[] = array('shortdesc' => $shortDesc, 'longdesc' => $longDesc, 'price' => $optionPrice, 'kind' => $optionType);
    $sortArr[] = $optionPrice;
    }
}

Any ideas where I am going wrong?

1 Answer 1

1

You're trying to sort SimpleXMLElement objects, not strings. Try casting the values to strings before you add them to the array:

foreach ($options as $key => $option) { // create the array for the options
  if ($option->OptionKind != 'Standard') {
    $longDesc = (string) $option->LongDescription;
    $shortDesc = (string) $option->ShortDescription;
    $optionPrice = (string) $option->Price;
    $optionType = (string) $option->OptionKind;
    $optionsArray[] = array('shortdesc' => $shortDesc, 'longdesc' => $longDesc, 'price' => $optionPrice, 'kind' => $optionType);
    $sortArr[] = $optionPrice;
    }
}
Sign up to request clarification or add additional context in comments.

Comments

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.