記一次陣列操作:陣列 A 根據陣列 B 排序

Egfly發表於2019-03-20

記一次陣列操作:陣列A根據陣列B排序


前言

最近遇到一個比較坑的事,應該也算是我自己平時觀察不仔細的鍋:在SQL中,如果使用in的欄位是主鍵,且為數字。查詢的結果會自動根據主鍵升序排序。

SELECT * FROM city WHERE ID IN (2,7,10,1,30,9,53)

file
而這並不是我想要的資料順序,所以只能去重新調整順序。

解決

首先將問題簡化一下:假設我們現有一個一維陣列$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 協議》,轉載必須註明作者和本文連結

相關文章