下面的陣列包含了一個更大的資料集的資料樣本--
$data =
[
[
'readingSequence' => '35',
'bookID' => '19',
'chapter' => '130'.
],
[
'readingSequence' => '19'。
'bookID' => '19',
'chapter' => '27'.
],
[
'readingSequence' => '59'。
'bookID' => '19',
'chapter' => '133'.
],
[
'readingSequence' => '35'。
'bookID' => '19',
'chapter' => '129''readingSequence' => '98'。
'bookID' => '75',
'chapter' => '6',
'verses' => '11-20,',
'versesFirst' => '11', '11'.
],
[
'readingSequence' => '99',
'bookID' => '75',
'chapter' => '6',
'verses' => '1-10',
'versesFirst' => '1',
]
];
該用例要求對$data中的元素進行排序,首先是bookID,然后是chapter,最后是versesFirst,如果該鍵存在的話。
下面的代碼成功地按bookID和chapter對陣列進行了排序,但是我還沒有想出一個方法來按versesFirst進行排序,因為它存在于一些元素中,但不存在于其他元素中 -
array_multisort(array_column($data, 'bookID') 。SORT_ASC, array_column($data, 'chapter'), SORT_ASC, $data) 。
下面是結果:
Array
(
[0] => Array[/span
(
[readingSequence] => 19 Array (
[bookID] =>19
[章節] => 271] => Array[/span
(
[readingSequence] => 35 Array (
[bookID] =>19
[章節] => 1292] => Array[/span
(
[readingSequence] => 35 Array (
[bookID] =>19
[章節] => 1303] => Array[/span
(
[readingSequence] => 59 Array (
[bookID] =>19
[章節] =>133
)
[4] => Array[/span
(
[readingSequence] => 98 Array (
[bookID] => 75 75
[章節] => 6 [章節] => 6
[詩句] => 11-20。
[versesFirst] => 11.
)
[5] => Array[/span>]。
(
[readingSequence] => 99 Array (
[bookID] => 75 75
[章節] => 6 [章節] => 6
[詩句] => 1-10
[versesFirst] =>1
)
)
元素0到3被正確排序,但元素4和5沒有,因為versesFirst沒有被包含。 當試圖包含它時,顯示了這個警告,結果與上面顯示的一樣。
警告:array_multisort()。Array sizes are inconsistent in C:developmentcratchpad.php on line 122
我可以在沒有[versesFirst] => ''的元素中加入versesFirst鍵,這樣它就可以被包含在多排序中,但我不想采用這種方式。 有什么方法可以在多排序中包括可選鍵嗎? 或者是否有一種完全不同的方法來實作所需的結果集?
uj5u.com熱心網友回復:
你可以使用usort來完成這個任務,用isset來檢查versesFirst鍵。
片段:
<?php
usort($data, function($a, $b){
$book_id_1 = intval($a['bookID'])。
$book_id_2 = intval($b['bookID']) 。
if($book_id_1 !=$book_id_2) return $book_id_1 <=> $book_id_2;
$chapter_1 = intval($a['chapter']) 。
$chapter_2 = intval($b['chapter']) 。
if($chapter_1 !=$chapter_2) return $chapter_1 <=> $chapter_2;
if(!isset($b['versesFirst']){
return -1。
}
if(!isset($a['versesFirst']){
return 1;
}
return intval($a['versesFirst'/span>]) < => intval($b['versesFirst'])。
});
print_r($data)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/328378.html
標籤:
