PHP - 带有键数组的度假村数组

PHP - Resort Array with a Key array

美好的一天,

所以我从以下数组开始,其中添加了项目。项目在列表中的添加顺序没有特定的排序,除了它们最初添加到数组中的顺序之外。为了便于阅读,我将它们按降序排列以解释我正在寻找的结果.对于此示例,这些值共享一个子键“tid”。

Array
(
    [0] => Array
        (
            [tid] => value_5
        )

    [1] => Array
        (
            [tid] => value_4
        )

    [2] => Array
        (
            [tid] => value_3
        )

    [3] => Array
        (
            [tid] => value_2
        )

    [4] => Array
        (
            [tid] => value_1
        )

)

我现在希望能够将第二个数组提供给一个函数,并对数组进行排序,以便将提供的与字段的“tid”相关的值排序到数组的前面按照给定的顺序,然后按照当前的顺序保留数组的其余部分。例如,如果我将以下数组作为排序键传递:

array("value_2", "value_3");

然后 value_2value_3 行应分别成为数组键 0 和 1,但数组的其余部分应保持与以下相同的顺序

Array
(
    [0] => Array
        (
            [tid] => value_2
        )

    [1] => Array
        (
            [tid] => value_3
        )

    [2] => Array
        (
            [tid] => value_5
        )

    [3] => Array
        (
            [tid] => value_4
        )

    [4] => Array
        (
            [tid] => value_1
        )

)

或者,如果在第二个数组中传递了一个不存在的值,如 value_9,我们只想忽略它并跳过它。

我探索了一些选项,如 foreachfor 循环并比较了值,但它很慢并且没有真正的递归,这似乎是这个函数可能需要的。

由于数组排序是 PHP 中的一个热门话题,因为有无数种方法可以做到这一点,我希望你们能找到解决这个问题的最佳方法。谢谢!

如果我理解正确你的问题,这里有一个可能的解决方案:

$firstArray = [
    [ 'tid' => 'value_5' ],
    [ 'tid' => 'value_4' ],
    [ 'tid' => 'value_3' ],
    [ 'tid' => 'value_2' ],
    [ 'tid' => 'value_1' ],
];

$tidToAdd = [ 'value_2', 'value_3', 'value_9' ];

// The solution is below:

$intersect = array_intersect(array_column($firstArray, 'tid'), $tidToAdd);

$firstArrayFiltered = array_filter($firstArray, fn($elem) => !in_array($elem['tid'], $intersect));

$result = array_reduce($intersect, function($payload, $item) {
    array_unshift($payload, ['tid' => $item]);
    return $payload;
}, $firstArrayFiltered);