记一次数组操作:数组A根据数组B排序

前言

最近遇到一个比较坑的事,应该也算是我自己平时观察不仔细的锅:在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) {
    $v = $arr2[$v];
}
print_r($arr1);

原文地址:https://www.cnblogs.com/egfly/p/11387235.html

时间: 2024-10-29 15:59:59

记一次数组操作:数组A根据数组B排序的相关文章

C#二进制字节数组操作函数 截取字节数组SubByte

/// <summary> /// 截取字节数组 /// </summary> /// <param name="srcBytes">要截取的字节数组</param> /// <param name="startIndex">开始截取位置的索引</param> /// <param name="length">要截取的字节长度</param> ///

javascript 常见数组操作( 1、数组整体元素修改 2、 数组筛选 3、jquery 元素转数组 4、获取两个数组中相同部分或者不同部分 5、数组去重并倒序排序 6、数组排序 7、数组截取slice 8、数组插入、删除splice(需明确位置) 9、数组遍历 10、jQuery根据元素值删除数组元素的方)

主要内容: 1.数组整体元素修改 2. 数组筛选 3.jquery 元素转数组 4.获取两个数组中相同部分或者不同部分 5.数组去重并倒序排序 6.数组排序 7.数组截取slice 8.数组插入.删除splice(需明确位置) 9.数组遍历 10.jQuery根据元素值删除数组元素的方法 数组常见操作包含了 增.删.查.改.插入.交集.并集 1.数组整体元素修改 //map,给数组每个元素加1 输出[1,2,3] $.map([0,1,2],function(n){ return n+1; })

js对象数组操作之一:对象数组中对象去重的方法总结

在日常开发业务中,经常会有一个数组由多个对象构成,需要对这种数据结构进行操作,如下: const arr = [ { name:'tom', age:15 }, { name:'jack', age:18 }, { name:'tom', age:10 }, ...] 今天总结了一下 先说这种数据结构的去重方法,对于数组中的多个对象去除重复,需要设置布尔值来进行. 一.jquery方法 var oldArr = [ { name:'tom', age:15 }, { name:'jack', a

廖雪峰Java1-4数组操作-3多维数组

二维数组 二维数组就是元素为数组的数组 二维数组每个数组的长度不要求一样.比如 int[][] = { { 1, 2 }, { 3, 4, 5 }, { 6, 7, 8, 9 } } int[][] ns={ {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; System.out.println("ns.length: "+ns.length); System.out.println("ns[1][2]: "+ns[1][

PHP内核探索之变量(4) - 数组操作

上一节(PHP内核探索之变量(3)- hash table),我们已经知道,数组在PHP的底层实际上是HashTable(链接法解决冲突),本文将对最常用的函数系列-数组操作的相关函数做进一步的跟踪. 本文主要内容: PHP中提供的数组操作函数 数组操作函数的实现 结语参考文献 一.PHP中提供的数组操作函数 可以说,数组是PHP中使用最广泛的数据结构之一,正因如此,PHP为开发者提供了丰富的数组操作函数(参见http://cn2.php.net/manual/en/ref.array.php

PHP数组操作大全

1 <?php 2 /** 3 * File: phpstudy : array_test.php 4 * Created by PhpStorm. 5 * User: IhMfLy [email protected] 6 * Date: 2016-08-03 7 * Time: 10:36 8 */ 9 24 25 26 # 创建数组 27 $arr1_0 = array(); 28 $arr1_0[] = 23; #创建,再初始化 29 $arr1_0[] = "lisi";

浅谈JavaScript中数组操作常用方法

JavaScript中数组操作常用方法 1.检测数组 1)检测对象是否为数组,使用instanceof 操作符 if(value instanceof Array) { //对数组执行某些操作 } 2)获取对象的类型,比较是否为object类型(此方法只能检测是否为Object,不推荐) if(typeof(value)=="Object") { //对数组执行某些操作 } 3)检测对象是否为数组,使用Array.isArray()方法(只支持ie9+,firefox 4+,safar

PHP内核探索之变量(4)- 数组操作

上一节(PHP内核探索之变量(3)- hash table),我们已经知道,数组在PHP的底层实际上是HashTable(链接法解决冲突),本文将对最常用的函数系列-数组操作的相关函数做进一步的跟踪. 本文主要内容: PHP中提供的数组操作函数 数组操作函数的实现 结语参考文献 一.PHP中提供的数组操作函数 可以说,数组是PHP中使用最广泛的数据结构之一,正因如此,PHP为开发者提供了丰富的数组操作函数(参见http://cn2.php.net/manual/en/ref.array.php

PHP数组操作汇总

对于Web编程来说,最重要的就是存取和读写数据了.存储方式可能有很多种,可以是字符串.数组.文件的形式等.数组,可以说是PHP的数据应用中较重要的一种方式.PHP的数组函数众多,下面是我学习的小结,借此记之,便于以后鉴之. 1. 数组定义 数组的定义使用 array()方式定义,可以定义空数组: 01 <?php 02     $number = array(1,3,5,7,9); 03     //定义空数组 04     $result = array(); 05     $color =a