对二维数组的行进行排序,以始终将指定值作为 firat 元素

问题描述 投票:0回答:3

我有一个非常大的数组。数组中的数组。以下是其中的一小部分;

[lta/] => Array(
    [2012-12-31/] => Array(
        [0] => 31_december_2012.pdf
        [1] => 31_december_2012.xls
        [2] => key_points.html
    )
    ...
)

我需要做的是让“key_points.html”值始终从其数组的顶部开始。示例;

[2012-12-31/] => Array
    (
        [2] => key_points.html            
        [0] => 31_december_2012.pdf
        [1] => 31_december_2012.xls  
    )
    ...
)

我无法进行简单的排序,因为我永远不知道“key_points.html”何时会出现在数组中。

我尝试重命名值“key_points.html”,以便对其进行排序,然后取消重命名;

foreach ($the_array as $array_object => $array_item) {
    if ($array_item == "key_points.html") {
        $array_item = "0001_key_points.html";
    }
}

但这似乎没有任何效果!它甚至没有重命名我的值。我也用字符串替换尝试了同样的事情;

$the_array = str_replace("key_points.html", "0001_key_points.html", $the_array);

是否有一个函数可以允许您指定一个字符串,并在每次找到它时将其移动到每个数组的顶部?

php arrays sorting multidimensional-array sticky
3个回答
1
投票

使用

uasort
指定自定义比较器回调:

uasort($array, function($a, $b) {
  if($a == 'key_points.html') return -1; // Smaller than all
  if($b == 'key_points.html') return 1;  // Larger than all
  return ($a < $b) ? -1 : 1;             // Default sorting
});

语法假设是最新的 PHP (5.3+),支持 匿名函数


0
投票

使用自定义功能

  function customSort (&$array, $key) {
        $sorter=array();
        $ret=array();
        reset($array);
        foreach ($array as $ii => $val) {
            $sorter[$ii]=$va[$key];
        }
        asort($sorter);
        foreach ($sorter as $ii => $val) {
            $ret[$ii]=$array[$ii];
        }
        $array=$ret;
    }
    customSort($your_array,"2");

0
投票

迭代调用

uasort()
可能是一种普遍考虑的解决方案,但这不会针对性能进行优化(这可能是“大数组”的一个问题)。 它会起作用,但我可能不会使用它,因为它在每一行上运行相对昂贵的排序算法。

代码:(演示

array_walk(
    $array['lta'],
    fn(&$v) => uasort(
        $v,
        fn($a, $b) => ($b === 'key_points.html')
            <=>
            ($a === 'key_points.html')
    )
);
var_export($array);

相反,搜索粘性元素的键,然后将该行附加到粘性元素的新声明中,“工作”会更少。 联合运算符 (

+
) 不允许原始粘性值存在于行的后面。

代码:(演示

foreach ($array['lta'] as &$row) {
    if (($k = array_search('key_points.html', $row)) !== false) {
        $row = [$k => 'key_points.html'] + $row;
    }
}
var_export($array);
© www.soinside.com 2019 - 2024. All rights reserved.