Reputation: 1208
I have an array which need to sort using a key value of "odbyx"
Here is the array var_dump
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 sort using below code but it seems not working
array_multisort(array_column($array, 'odbyx'), SORT_DESC, $array);
odbyx field hold a priority values (1,2,3).
i need to sort main array using that values, so i can display top priority fields at the beginning soo on a table
I want to sort the $array using "odbyx" descending order
Example Output of id array, the other arrays also need to sort at once.
["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" }
Upvotes: 5
Views: 1478
Reputation: 5683
See also: Sort Multi-dimensional Array by Value
Expected first entry in result: 0 => '6'
odbyx-index == id-index
Should indices in odbyx
match to indices in id
?
i.e.: $array['id'][3]
should be sorted by $array['odbyx'][3]
If this is the case, then your provided code should either yield 0 => '8'
for the first index (odbyx 1 higher-priority than 3), or 0 => '1'
(3 is higher).
odbyx-index == id-value
Should the index in odbyx
match to the id values in id
?
i.e.: The value of $array['odbyx'][1]
determines the sort 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 specification, i.e.: carefully define and describe the specific conditions required to solve your problem, on stackoverflow or anywhere else.
Since the problem you are asking to be solved is complex, poorly defined, would require a significant amount of coding and testing, and has significant performance implications, I'll leave you with this tidbit of a solution to 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);
Upvotes: 1