【问题标题】:Re-order PHP array by middle key as start (Circular Sorting)通过中间键重新排序 PHP 数组作为开始(循环排序)
【发布时间】:2014-01-05 12:16:45
【问题描述】:

非常基本的问题,但是我在 PHP.NET 上找不到答案。

我有以下数组:

Array (

[1] => Array
    (
        [1] => 4
        [2] => 1
        [3] => 5
        [4] => 3
    )

[2] => Array
    (
        [5] => 2
        [6] => 8
        [7] => 7
        [8] => 6
    )

[3] => Array
    (
        [9] => 10
        [10] => 9
        [11] => 12
        [12] => 11
    )

[4] => Array
    (
        [13] => 15
        [14] => 16
        [15] => 14
        [16] => 13
    )

)

我希望对数组进行重新排序,以便数组的第一个系列中的键号 3 成为第一个,然后从那里重新排序其余的,最终得到以下结果:

Array (

[3] => Array
    (
        [9] => 10
        [10] => 9
        [11] => 12
        [12] => 11
    )

[4] => Array
    (
        [13] => 15
        [14] => 16
        [15] => 14
        [16] => 13
    )

[1] => Array
    (
        [1] => 4
        [2] => 1
        [3] => 5
        [4] => 3
    )

[2] => Array
    (
        [5] => 2
        [6] => 8
        [7] => 7
        [8] => 6
    )

)

我正在寻找一种方法来执行此操作,以便我可以定义数组,然后是我需要排序的第一级键,然后它将以这种方式返回数组。

标准的 PHP 键似乎没有提供这样的功能,所以最好能够有一个单独的函数,例如 $newArray = reorder_array($array, $key);

我不需要对第二级进行任何排序,只需要最初的 4 个主/第一级数组部分。

非常感谢您的帮助,因为我已经在这个问题上坐了一段时间,但没有一个清晰而简单的解决方案。

【问题讨论】:

  • 你试过asort()函数吗?
  • 我无法理解您想要执行的排序逻辑,抱歉。请解释您想要实现的逻辑(例如:究竟是什么使元素上升或下降等)。
  • @Calimero 循环排序。
  • @safarov 知道了,谢谢。

标签: php arrays sorting key


【解决方案1】:

您可以通过一个foreach 循环简单地实现重新排序,例如:

function reorderArray($array, $key)
{
    $found = false;
    foreach($array as $k=>$v)
    {
        $found = $found || $k===$key;
        if(!$found)
        {
            unset($array[$k]);
            $array[$k] = $v;
        }
        //else break can be added for performance issues
    }
    return $array;
}

有用法

$array=[1=>'foo', 4=>'bar', 9=>'baz', 'test'=>51];
var_dump(reorderArray($array, 9));
var_dump(reorderArray($array, 'test'));
var_dump(reorderArray($array, 'no_such_key'));//original array in result

-检查this 演示。但是,如果键是连续的数字,则可以通过 array_slice() 调用轻松实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多