3 回答

TA貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊
您的問題基本上是如何根據(jù)兩個(gè)鍵對(duì)數(shù)組進(jìn)行排序。在許多編程語言中,包括PHP,答案是創(chuàng)建一個(gè)比較函數(shù)(有時(shí)稱為比較器),該函數(shù)根據(jù)其參數(shù)所需的相對(duì)順序返回值(通常為-1,0,1)。如果兩個(gè)鍵中的第一個(gè)參數(shù)不同,則根據(jù)第一個(gè)鍵的順序返回 -1 或 1。它們?cè)诘谝粋€(gè)鍵上相等,檢查第二個(gè)鍵 - 并根據(jù)第二個(gè)鍵的順序返回-1,0,1。此邏輯自然可以擴(kuò)展到任意數(shù)量的密鑰。PHP Spaceship 運(yùn)算符 <=>
為許多內(nèi)置類型實(shí)現(xiàn)了此邏輯。
下面的代碼演示了使用 PHP 的方案的這一點(diǎn)。它是從這個(gè)問題改編而來的。在這里,我假設(shè)您要按速率(零<超減<減<中等<標(biāo)準(zhǔn))進(jìn)行排序,然后按(數(shù)字)進(jìn)行排序。我也糾正了.spec_id
SUPER REDUCES RATE
SUPER REDUCED RATE
$RATE_ORDERING = array(
'ZERO RATE' => 1,
'SUPER REDUCED RATE' => 2,
'REDUCED RATE' => 3,
'MEDIUM RATE' => 4,
'STANDARD RATE' => 5
);
$arr = array(
array('spec_id' => 2, 'spec_children_name' => 'STANDARD RATE'),
array('spec_id' => 1, 'spec_children_name' => 'STANDARD RATE'),
array('spec_id' => 2, 'spec_children_name' => 'ZERO RATE'),
array('spec_id' => 1, 'spec_children_name' => 'MEDIUM RATE'),
array('spec_id' => 2, 'spec_children_name' => 'REDUCED RATE'),
array('spec_id' => 2, 'spec_children_name' => 'MEDIUM RATE'),
array('spec_id' => 1, 'spec_children_name' => 'SUPER REDUCED RATE'),
array('spec_id' => 2, 'spec_children_name' => 'SUPER REDUCED RATE'),
array('spec_id' => 1, 'spec_children_name' => 'REDUCED RATE'),
array('spec_id' => 1, 'spec_children_name' => 'ZERO RATE')
);
usort($arr, function ($a, $b) use ($RATE_ORDERING) {
$result = $RATE_ORDERING[$a['spec_children_name']] - $RATE_ORDERING[$b['spec_children_name']];
if ($result != 0) {
return $result;
}
return $a['spec_id'] - $b['spec_id'];
});
var_dump($arr);
輸出:
array(10) {
[0]=>
array(2) {
["spec_id"]=>
int(1)
["spec_children_name"]=>
string(9) "ZERO RATE"
}
[1]=>
array(2) {
["spec_id"]=>
int(2)
["spec_children_name"]=>
string(9) "ZERO RATE"
}
[2]=>
array(2) {
["spec_id"]=>
int(1)
["spec_children_name"]=>
string(18) "SUPER REDUCED RATE"
}
[3]=>
array(2) {
["spec_id"]=>
int(2)
["spec_children_name"]=> [17/133]
string(18) "SUPER REDUCED RATE"
}
[4]=>
array(2) {
["spec_id"]=>
int(1)
["spec_children_name"]=>
string(12) "REDUCED RATE"
}
[5]=>
array(2) {
["spec_id"]=>
int(2)
["spec_children_name"]=>
string(12) "REDUCED RATE"
}
[6]=>
array(2) {
["spec_id"]=>
int(1)
["spec_children_name"]=>
string(11) "MEDIUM RATE"
}
[7]=>
array(2) {
["spec_id"]=>
int(2)
["spec_children_name"]=>
string(11) "MEDIUM RATE"
}
[8]=>
array(2) {
["spec_id"]=>
int(1)
["spec_children_name"]=>
string(13) "STANDARD RATE"
}
[9]=>
array(2) {
["spec_id"]=>
int(2)
["spec_children_name"]=>
string(13) "STANDARD RATE"
}
}

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊
宇宙飛船操作員將自動(dòng)處理所有數(shù)據(jù)類型。將動(dòng)態(tài)列名和排序方向“factor”傳遞到自定義函數(shù)作用域中。use()
代碼:
$objects = json_decode($json);
$column = 'spec_children_name';
$direction = 'asc';
$reverser = $direction === 'asc' ? 1 : -1;
uasort($objects, function($a, $b) use ($column, $reverser) {
return $reverser * ($a->$column <=> $b->$column);
});
var_export($objects);
或者也許...
$objects = json_decode($json);
$rules = ['spec_id' => 'ASC', 'spec_children_name' => 'DESC'];
uasort($objects, function($a, $b) use ($rules) {
foreach ($rules as $column => $order) {
$left[] = $order === 'ASC' ? $a->$column : $b->$column;
$right[] = $order === 'ASC' ? $b->$column : $a->$column;
}
return $left <=> $right;
});
var_export($objects);

TA貢獻(xiàn)1884條經(jīng)驗(yàn) 獲得超4個(gè)贊
幾乎沒有理由像array_multisort和array_column那樣重新發(fā)明一個(gè)功能。
$data =
[
[
'name' => 'John',
'age' => 34
],
[
'name' => 'Jack',
'age' => 55,
],
[
'name' => 'Adam',
'age' => 42
],
[
'name' => 'Jack',
'age' => 78
],
[
'name' => 'Adam',
'age' => 80
]
];
array_multisort(array_column($data, 'name'), SORT_ASC, array_column($data, 'age'), SORT_DESC, $data);
var_export($data);
輸出:
array (
0 =>
array (
'name' => 'Adam',
'age' => 80,
),
1 =>
array (
'name' => 'Adam',
'age' => 42,
),
2 =>
array (
'name' => 'Jack',
'age' => 78,
),
3 =>
array (
'name' => 'Jack',
'age' => 55,
),
4 =>
array (
'name' => 'John',
'age' => 34,
),
)
- 3 回答
- 0 關(guān)注
- 152 瀏覽
添加回答
舉報(bào)