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

2022-01-30 20:51:08 字數 3618 閱讀 9858

前言

最近遇到乙個比較坑的事,應該也算是我自己平時觀察不仔細的鍋:在sql中,如果使用in的字段是有設定btree索引,且為數字。查詢的結果會自動根據索引列公升序排序。

select * from city where id in (2,7,10,1,30,9,53)
而這並不是我想要的資料順序,所以只能去重新調整順序。ps:這裡是通過陣列手動排序,也可以在sql裡通過order by feild保證順序。

解決首先將問題簡化一下:假設我們現有乙個一維陣列$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"],

];$arr3 = array_column($arr2, null, 'id');

//將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

))// 其他更優解

$arr2 = array_column($arr2, null, 'id');

foreach ($arr1 as &$v)

print_r($arr1);

javascript陣列之基本操作 陣列屬性

基本操作 一 訪問資料元素 陣列的值可以通過自然數索引訪問進行讀寫操作 1.單位陣列 陣列名 下標索引 2.多維陣列 陣列名 外層陣列下標 內層元素下標 3.特性 陣列長度是彈性的,可自由伸縮 陣列下標從0開始 下標型別 數值 非數值 為字串 生成關聯陣列 下標作為物件屬性的名字 陣列元素可以新增到...

js陣列操作 陣列扁平化

陣列的扁平化,就是將乙個巢狀多層的陣列 巢狀可以是任何層數 轉換為只有一層 或者指定層 的陣列。這個操作在實際開發過程還是有一定的需求場景的。在es6中已經提供了實現這個功能的方法,本文討論了模擬實現的方案。關鍵字 模擬實現 array.prototype.flat 本文介紹了es6中給陣列提供的f...

記一次資料庫誤操作 資料恢復

今天運算元據庫不小心修改掉了全庫的資料。炸了。這裡有個恢復的orcal 資料的辦法 create table t table recove 新錶 asselect from t table 你操作的那張表 as of timestamp to timestamp 2010 06 02 11 36 5...