【问题标题】:Custom sort a multidimensional array by subarray keys using another array使用另一个数组按子数组键对多维数组进行自定义排序
【发布时间】:2019-06-10 01:00:31
【问题描述】:

我有 2 个数组。 Array1 看起来像这样(这只是一个小例子,实际上它有超过 408 行):

Array
(
    [0] => Array ( [536870925] => 34213897 )
    [1] => Array ( [536870923] => 34213905 )
    [2] => Array ( [536870923] => 34213913 )
    [3] => Array ( [536870928] => 34213921 )
    [4] => Array ( [536870926] => 34213929 )
    [5] => Array ( [536870919] => 34213937 )
    [6] => Array ( [536870918] => 34218041 )
    [7] => Array ( [536870925] => 34218049 )
    [8] => Array ( [536870929] => 34218057 )
    [9] => Array ( [536870920] => 34218065 )
    [10] => Array ( [536870920] => 34218073 )
)

Array2 看起来像这样,它只有 16 行:

Array
(
    [0] => 536870922
    [1] => 536870923
    [2] => 536870924
    [3] => 536870925
    [4] => 536870926
    [5] => 536870927
    [6] => 536870928
    [7] => 536870929
    [8] => 536870914
    [9] => 536870915
    [10] => 536870916
    [11] => 536870917
    [12] => 536870918
    [13] => 536870919
    [14] => 536870920
    [15] => 536870921
)

array2 中的所有 id 都存在于 array1 中。

array1 和 array2 都是从两个不同的索引中收集的 trow snmp_get。我需要重新排序 array1 中的 id 和 tthir 等效值,以匹配 array2 中显示的 id 顺序。

我尝试使用带有 array1 的 foreach,但使用 array2 作为控制器,类似这样,显然这不起作用..

$i = 0;
foreach ($intmac_ids as $value) {
        echo $value[$unique_mac_id[$i++]];
}

我正在寻找的输出是这样的:

Array
    (
        [0] => Array ( [536870923] => 34213905 )
        [1] => Array ( [536870923] => 34213913 )
        [2] => Array ( [536870925] => 34213897 )
        [3] => Array ( [536870925] => 34218049 )
        [4] => Array ( [536870926] => 34213929 )
        [5] => Array ( [536870928] => 34213921 )
        [6] => Array ( [536870929] => 34218057 )
        [7] => Array ( [536870918] => 34218041 )
        [8] => Array ( [536870919] => 34213937 )
        [9] => Array ( [536870920] => 34218065 )
        [10] => Array ( [536870920] => 34218073 )
    )

【问题讨论】:

  • 我想我不明白你想做什么。第二个数组需要什么?您能否提供一个具有所需输出的较小示例?
  • 对于某些键,您在 array1 中有多个值,例如536870914.你想退回哪一个?
  • 基本上我需要 array1 的值按照 array2 中 id 的顺序排列,这样我就可以根据 array2 的顺序创建一个新数组
  • array1 和 array2 都是从两个不同的索引中收集的 trow snmp_get。我需要重新排序 ids 和从 array1 到 ids 在 array2 中显示的顺序的等效值
  • 两个数组中是否都存在所有 id?请用您想要的输出更新您的问题。

标签: php arrays sorting usort


【解决方案1】:

您可以在$array1 上使用usort(),并将$array2 作为排序顺序查找数组传入。

代码:(Demo)

$array1 = [
    [536870914 => 34213897],
    [536870914 => 34213905],
    [536870915 => 34213921],
    [536870914 => 34213913],
    [536870915 => 34213929],
    [536870917 => 34213937],
    [536870925 => 34218049],
];

$array2 = [
    536870925,
    536870914,
    536870915,
    536870917,
];

usort($array1, function($a, $b) use ($array2) {
    return array_search(key($a), $array2) <=> array_search(key($b), $array2);
});

var_export($array1);

为了让这个过程更高效,提前翻转查找数组。

代码:(Demo)

$array2 = array_flip($array2);

usort($array1, function($a, $b) use ($array2) {
    return $array2[key($a)] <=> $array2[key($b)];
});

var_export($array1);

如果 array1 中的某些 id 没有在 array2 中表示,您将需要确定这些异常值应如何排序。如果您不对查找数组中的缺失值进行调整,您将生成通知并获得意外的排序结果。

这是一个类似的帖子,提供了关于该主题的一些指导:

https://stackoverflow.com/a/52754080/2943403

【讨论】:

    猜你喜欢
    • 2013-02-06
    • 2011-12-10
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多