記一次陣列操作:陣列A根據陣列B排序
前言
最近遇到一個比較坑的事,應該也算是我自己平時觀察不仔細的鍋:在SQL中,如果使用in
的欄位是主鍵,且為數字。查詢的結果會自動根據主鍵升序排序。
SELECT * FROM city WHERE ID IN (2,7,10,1,30,9,53)
而這並不是我想要的資料順序,所以只能去重新調整順序。
解決
首先將問題簡化一下:假設我們現有一個一維陣列$arr1
,一個多維陣列$arr2
,現在需要$arr2
的ID根據$arr1
排序。
$arr1 = [2,7,10,1,30,9,53];
$arr2 = [
["ID" => 1, "Name" => "Kabul"],
["ID" => 2, "Name" => "Qandahar"],
["ID" => 7, "Name" => "Haag"],
["ID" => 9, "Name" => "Eindhoven"],
["ID" => 10, "Name" => "Tilburg"],
["ID" => 30, "Name" => "Delft"],
["ID" => 53, "Name" => "Tafuna"],
];
在解決問題之前我們先回顧一下array_flip()
、array_replace()
1. array_flip()
array_flip($array)
反轉/交換陣列(一維陣列)中的鍵名和對應關聯的鍵值。
<?php
$a1=array("a"=>"red","b"=>"green","c"=>"blue","d"=>"yellow");
$result=array_flip($a1);
print_r($result);
//result:
Array
(
[red] => a
[green] => b
[blue] => c
[yellow] => d
)
?>
2. array_replace()
array_replace(array1,array2,array3...)
用後面陣列的值替換第一個陣列的值。
如果一個鍵存在於第一個陣列 array1 同時也存在於第二個陣列 array2,第一個陣列 array1 中的值將被第二個陣列 array2 中的值替換。如果一個鍵僅存在於第一個陣列 array1,它將保持不變。
如果一個鍵存在於第二個陣列 array2,但是不存在於第一個陣列 array1,則會在第一個陣列array1 中建立這個元素。
如果傳遞了多個替換陣列,它們將被按順序依次處理,後面陣列的值將覆蓋之前陣列的值。
<?php
//示例1
$a1=array("a"=>"red","b"=>"green");
$a2=array("a"=>"orange","burgundy");
print_r(array_replace($a1,$a2));
//result
Array ( [a] => orange [b] => green [0] => burgundy)
//示例2
$a3=array("a"=>"red","green");
$a4=array("a"=>"orange","b"=>"burgundy");
print_r(array_replace($a3,$a4));
//result
Array ( [a] => orange [0] => green [b] => burgundy)
//示例3
$a5=array("red","green");
$a6=array("blue","yellow");
$a7=array("orange","burgundy");
print_r(array_replace($a5,$a6,$a7));
//result
Array ( [0] => orange [1] => burgundy)
?>
實現
根據上面兩個函式,可以先將$arr1
鍵值交換,然後將$arr2
裡的ID的值作為$arr3
第一維的鍵,最後用$arr3
替換$arr1
,就可以實現排序了。
$arr1 = [2, 7, 10, 1, 30, 9, 53];
$arr2 = [
["ID" => 1, "Name" => "Kabul"],
["ID" => 2, "Name" => "Qandahar"],
["ID" => 7, "Name" => "Haag"],
["ID" => 9, "Name" => "Eindhoven"],
["ID" => 10, "Name" => "Tilburg"],
["ID" => 30, "Name" => "Delft"],
["ID" => 53, "Name" => "Tafuna"],
];
//將ID作為新陣列第一維的鍵
$arr3 = array_column($arr2, null, 'ID');
$arr3 = array_replace(array_flip($arr1), $arr3);
print_r(array_values($arr3));
//result
Array
(
[0] => Array
(
[ID] => 2
[Name] => Qandahar
)
[1] => Array
(
[ID] => 7
[Name] => Haag
)
[2] => Array
(
[ID] => 10
[Name] => Tilburg
)
[3] => Array
(
[ID] => 1
[Name] => Kabul
)
[4] => Array
(
[ID] => 30
[Name] => Delft
)
[5] => Array
(
[ID] => 9
[Name] => Eindhoven
)
[6] => Array
(
[ID] => 53
[Name] => Tafuna
)
)
本作品採用《CC 協議》,轉載必須註明作者和本文連結