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_2
和 value_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
,我们只想忽略它并跳过它。
我探索了一些选项,如 foreach
和 for
循环并比较了值,但它很慢并且没有真正的递归,这似乎是这个函数可能需要的。
由于数组排序是 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);
美好的一天,
所以我从以下数组开始,其中添加了项目。项目在列表中的添加顺序没有特定的排序,除了它们最初添加到数组中的顺序之外。为了便于阅读,我将它们按降序排列以解释我正在寻找的结果.对于此示例,这些值共享一个子键“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_2
和 value_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
,我们只想忽略它并跳过它。
我探索了一些选项,如 foreach
和 for
循环并比较了值,但它很慢并且没有真正的递归,这似乎是这个函数可能需要的。
由于数组排序是 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);