PHP使某些键在关联数组中具有粘性

时间:2019-05-21 03:27:50

标签: php

我尝试使用array_columnarray_multisort按键(ID)对数组B进行排序。

但是,我有一种情况,我需要一些ID粘贴在顶部

例如,通过比较数组A和数组B ,将ID 3和ID 1移动到数组B的顶部。最终结果将是数组C

是否存在PHP数组函数来实现这一目标?请指教...

阵列A

Array
(
    [0] => Array
        (
            [ID] => 3
        )

    [1] => Array
        (
            [ID] => 1
        )
)
1

阵列B

Array
(
    [0] => Array
        (
            [ID] => 1
            [product] => A
        )

    [1] => Array
        (
            [ID] => 2
            [product] => B
        )

    [2] => Array
        (
            [ID] => 3
            [product] => C
        )

    [3] => Array
        (
            [ID] => 4
            [product] => D
        )
)
1

数组C(结果)

Array
(
    [0] => Array
        (
            [ID] => 3
            [product] => C
        )

    [1] => Array
        (
            [ID] => 1
            [product] => A
        )

    [2] => Array
        (
            [ID] => 2
            [product] => B
        )

    [3] => Array
        (
            [ID] => 4
            [product] => D
        )
)
1

2 个答案:

答案 0 :(得分:1)

通过更深入地了解您的项目范围,可以避免生成查找和异常值所涉及的准备步骤,但是我将仅使用您提供的值。 (我的意思是,为简洁起见,您可以将异常值硬编码为9999999并将array_flip包裹在array_column周围。)

只需将其最大值设置为高于优先级数组中最高ID的值即可。

查找需要将ID值作为键,并将其原始索引作为新值(因此需要翻转)。

usort()正是执行自定义排序过程时要使用的php函数。

use对于将所需的其他值传递到自定义函数的作用域是必需的。

宇宙飞船运算符(<=>)是打包两种条件排序逻辑的绝佳方法。将使用“从左到右”值比较每一侧。

代码:(Demo

$priority = [['ID' => 3], ['ID' => 1]];
$input = [['ID' => 1, 'product' => 'A'], ['ID' => 2, 'product' => 'B'], ['ID' => 3, 'product' => 'C'], ['ID' => 4, 'product' => 'D']];

$lookup = array_column($priority, 'ID');
$outlier = max($lookup) + 1;
$lookup = array_flip($lookup);

usort($input, function($a, $b) use ($lookup, $outlier) {
    return [$lookup[$a['ID']] ?? $outlier, $a['ID']] <=> [$lookup[$b['ID']] ?? $outlier, $b['ID']];
});

var_export($input);

输出:

array (
  0 => 
  array (
    'ID' => 3,
    'product' => 'C',
  ),
  1 => 
  array (
    'ID' => 1,
    'product' => 'A',
  ),
  2 => 
  array (
    'ID' => 2,
    'product' => 'B',
  ),
  3 => 
  array (
    'ID' => 4,
    'product' => 'D',
  ),
)

如果没有飞船运算符,则自定义功能会变得更加冗长。

代码:(Demo

usort($input, function($a, $b) use ($lookup, $outlier) {
    $bIsPriority = isset($lookup[$b['ID']]);
    if (isset($lookup[$a['ID']])) {
        if ($bIsPriority) {
            return $lookup[$a['ID']] - $lookup[$b['ID']];
        } else {
            return -1;
        }
    } elseif ($bIsPriority) {
        return 1;
    } else {
        return $a['ID'] - $b['ID'];
    }
});

答案 1 :(得分:0)

这是其中之一:

<?php
$a = [['ID' => 5], ['ID' => 1]];
$b = [['ID' => 1, 'product' => 'A'], ['ID' => 2, 'product' => 'B'], ['ID' => 3, 'product' => 'C'], ['ID' => 4, 'product' => 'D'], ['ID' => 5, 'product' => 'E']];

// $keysOnTop = Array([0] => 5, [1] => 1)
$keysOnTop = array_column($a, 'ID');

$temp1 = $temp2 = [];
foreach($b as $value){
    if(in_array($value['ID'], $keysOnTop)){
        $temp1[] = $value;
    } else {
        $temp2[] = $value;
    }
}
// $temp1 = Array([0] => Array([ID] => 1, [product] => A), [1] => Array([ID] => 5, [product] => E))
// $temp2 = Array([0] => Array([ID] => 2, [product] => B), [1] => Array([ID] => 3, [product] => C), [2] => Array([ID] => 4, [product] => D))

$final_arr = array_merge($temp1, $temp2);

echo '<pre>';
print_r($final_arr);

// Output:
/*
Array
(
    [0] => Array
        (
            [ID] => 1
            [product] => A
        )

    [1] => Array
        (
            [ID] => 5
            [product] => E
        )

    [2] => Array
        (
            [ID] => 2
            [product] => B
        )

    [3] => Array
        (
            [ID] => 3
            [product] => C
        )

    [4] => Array
        (
            [ID] => 4
            [product] => D
        )

)
*/

?>