前言
最近遇到乙個比較坑的事,應該也算是我自己平時觀察不仔細的鍋:在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...