Sort an array of PHP arrays using the specialc key value

I have an array that needs to be sorted using the key value "odbyx"

Here is the var_dump array

array(12) { ["id"]=> array(7) { [0]=> string(1) "8" [1]=> string(1) "7" [2]=> string(1) "3" [3]=> string(1) "6" [4]=> string(1) "5" [5]=> string(1) "2" [6]=> string(1) "1" } ["subject"]=> array(7) { [0]=> string(14) "ticke tick sbj" [1]=> string(13) "new tick test" [2]=> string(15) "fdsfdsfdsfdsfds" [3]=> string(12) "test subject" [4]=> string(4) "test" [5]=> string(4) "test" [6]=> string(12) "test subject" } ["msg"]=> array(7) { [0]=> string(9) "test+tick" [1]=> string(4) "test" [2]=> string(9) "dfdsfdsfd" [3]=> string(12) "test+tcikets" [4]=> string(4) "test" [5]=> string(12) "test+message" [6]=> string(7) "tssssss" } ["department"]=> array(7) { [0]=> string(10) "Technician" [1]=> string(5) "Admin" [2]=> string(5) "Admin" [3]=> string(10) "Technician" [4]=> string(10) "Technician" [5]=> string(5) "Admin" [6]=> string(5) "Admin" } ["priorety"]=> array(7) { [0]=> string(3) "Low" [1]=> string(6) "Normal" [2]=> string(3) "Low" [3]=> string(3) "Low" [4]=> string(4) "High" [5]=> string(6) "Normal" [6]=> string(3) "Low" } ["status"]=> array(7) { [0]=> string(4) "open" [1]=> string(8) "answered" [2]=> string(8) "answered" [3]=> string(4) "open" [4]=> string(4) "open" [5]=> string(4) "open" [6]=> string(6) "closed" } ["dateAded"]=> array(7) { [0]=> string(19) "2017-10-01 12:34:56" [1]=> string(19) "2017-09-27 13:41:09" [2]=> string(19) "2017-09-17 13:53:04" [3]=> string(19) "2017-09-25 15:00:48" [4]=> string(19) "2017-09-23 10:41:24" [5]=> string(19) "2017-09-17 13:31:56" [6]=> string(19) "2017-09-17 12:37:22" } ["dateClosed"]=> array(7) { [0]=> string(19) "0000-00-00 00:00:00" [1]=> string(19) "0000-00-00 00:00:00" [2]=> string(19) "0000-00-00 00:00:00" [3]=> string(19) "0000-00-00 00:00:00" [4]=> string(19) "0000-00-00 00:00:00" [5]=> string(19) "2017-09-30 13:41:09" [6]=> string(19) "2017-09-17 13:40:53" } ["dateActivity"]=> array(7) { [0]=> string(19) "2017-10-01 12:34:56" [1]=> string(19) "2017-10-01 07:49:20" [2]=> string(19) "2017-09-26 10:35:36" [3]=> string(19) "2017-09-25 15:00:48" [4]=> string(19) "2017-09-23 10:41:24" [5]=> string(19) "2017-09-17 13:41:21" [6]=> string(19) "2017-09-17 13:40:53" } ["userId"]=> array(7) { [0]=> string(1) "4" [1]=> string(1) "4" [2]=> string(1) "3" [3]=> string(1) "4" [4]=> string(1) "7" [5]=> string(1) "3" [6]=> string(1) "2" } ["res"]=> string(4) "true" ["odbyx"]=> array(7) { [0]=> int(1) [1]=> int(2) [2]=> int(3) [3]=> int(2) [4]=> int(3) [5]=> int(3) [6]=> int(3) } } 

Logic behind the array

 $array = array ( "id" => $id, "subject" => $subject, "msg" => $msg, "department" => $department, "priorety" => $priorety, "status" => $status, "dateAded" => $dateAded, "dateClosed" => $dateClosed, "dateActivity" => $dateActivity, "userId" => $userId, "res" => $res, "odbyx"=>$odbyx ); 

I tried sorting using the code below but it doesn't seem to work

 array_multisort(array_column($array, 'odbyx'), SORT_DESC, $array); 
Field

odbyx contains priority values ​​(1,2,3).

I need to sort the main array using these values, so I can display the top priority fields at the beginning of soo in the table

I want to sort the $ array using odbyx " in descending order

can someone help me fix this. Thank you.

Example output of an id array, other arrays also need to be sorted immediately.

 ["id"]=> array(7) { [0]=> string(1) "6" [1]=> string(1) "5" [2]=> string(1) "4" [3]=> string(1) "3" [4]=> string(1) "7" [5]=> string(1) "6" [6]=> string(1) "8" } 
+5
source share
1 answer

proper use of usort

See also: Sorting a multidimensional array by value

your example is invalid

Expected first record as a result: 0 => '6'

Possible interpretation of odbyx-index == id-index

If the indices in odbyx match the indices in id ?

ie: $array['id'][3] should be sorted by $array['odbyx'][3]

If so, then the code you provide should either get 0 => '8' for the first index (odbyx 1 with a higher priority than 3), or 0 => '1' (3 above).

Possible interpretation of odbyx-index == id-value

If the index in odbyx matches id values in id ?

ie The value of $array['odbyx'][1] defines the sorting for $array['id'][6] = '1'

In this case, the result should be 0 => '2'

None of these possible interpretations even match the very first result in your example. The lesson here is the specification, i.e. Carefully identify and describe the specific conditions necessary to solve your problem, in stackoverflow or elsewhere.

Here is the place to run

Since the problem you are asking to solve is complex, poorly defined, requires a significant amount of coding and testing and has significant performance implications, I will leave you with this tidbit of solving one of the impossible interpretations above. Good luck.

 Class SimpleSorter { private $orderBy; private $sortMe; public static function sortByIndexedOrderField(array $sortMe, array $byMe) { $sorter = new self($sortMe); return $sorter->applyIndexedOrder($byMe); } public function __construct(array $sortMe) { $this->sortMe = $sortMe; } public function applyIndexedOrder(array $byMe): array { $this->orderBy = $byMe; $keys = array_keys($this->sortMe); // sort, first by odbyx, then by value usort($keys, function($a,$b){ $odbyx = 0; if (array_key_exists($a, $this->orderBy) && array_key_exists($b, $this->orderBy)) { $odbyx = $this->orderBy[$b] <=> $this->orderBy[$a]; } if (0 !== $odbyx) { return $odbyx; } return $this->sortMe[$a] <=> $this->sortMe[$b]; }); // reorder by new key order $result = []; foreach($keys as $key) { $result[$key] = $this->sortMe[$key]; } return $result; } } $array = []; $array["id"] = [ 0 => '8', 1 => '7', 2 => '3', 3 => '6', 4 => '5', 5 => '2', 6 => '1', ]; $array["odbyx"] = [ 0 => 1, 1 => 2, 2 => 3, 3 => 2, 4 => 3, 5 => 3, 6 => 3, ]; $idsSorted = SimpleSorter::sortByIndexedOrderField($array["id"], $array["odbyx"]); print_r($idsSorted); 
+1
source

Source: https://habr.com/ru/post/1272263/


All Articles