PHP:在给定值之后对多维数组进行排序(而不是从数组中)

时间:2016-12-06 22:47:24

标签: php sorting multidimensional-array

我有一个多维数组,我需要在给定值后排序(从数组外部给出)

这是数组:

    array (
    [0] => array 
    (
        ["tfl_gpac_color"] => array([0] => "FF0000"),
        ["tfl_gpac_start"] => "1",
        ["tfl_gpac_end"] => "32"
    ),
    [1] => array
    (
        ["tfl_gpac_color"] => array([0] => "0000FF"),
        ["tfl_gpac_start"] => "33",
        ["tfl_gpac_end"] => "64"
    ),
    [2] => array
    (
        ["tfl_gpac_color"] => array([0] => "800080"),
        ["tfl_gpac_start"] => "65",
        ["tfl_gpac_end"] => "96"
    )
)

我也有来自配置的给定值

$strStartNumber = '33';

strStartNumber发生了变化,我希望数组按此值排序,与'tfl_gpac_start'进行比较。

如果数字是33,我希望第一个条目是一个,其中33来自'tfl_gpac_start',如果值为65,它应该以'tfl_gpac_start'开头,数字为65。

对于像这样的'33'(与上面的那个相比):

array (
[0] => array 
(
    ["tfl_gpac_color"] => array([0] => "0000FF"),
    ["tfl_gpac_start"] => "33",
    ["tfl_gpac_end"] => "64"
),

[1] => array
(
    ["tfl_gpac_color"] => array([0] => "800080"),
    ["tfl_gpac_start"] => "65",
    ["tfl_gpac_end"] => "96"
),
[2] => array
(
    ["tfl_gpac_color"] => array([0] => "FF0000"),
    ["tfl_gpac_start"] => "1",
    ["tfl_gpac_end"] => "32"
)

非常感谢你的帮助,我尝试了几种不同的方法,但我没有把它弄好......

编辑:之后所有值都应该在同一个地方(应该保持在一起),因此排序应该仅适用于第一个数组的键。

3 个答案:

答案 0 :(得分:0)

您无法有效地对数组进行排序。但是,根据您使用数据的方式以及是否可以缓存此数据,您可以重新构建数据。

例如,您可以使用foreach循环创建索引表:

$index = [1 => 0, 33 => 1, 65 => 2];

其中0,1,2是原始数组中的索引。然后你可以对它们进行排序:

ksort($index);

现在它们已经有序了,您可以通过$strStartNumber = 33

获取$array[$index[$strStartNumber]]原始数组中的所有数据

当您需要获取后面的那个时,您可以获得:$array[$index[$strStartNumber] + 1]

但是,看起来你可能希望它循环,所以如果$strStartNumber = 65那么$array[$index[$strStartNumber] + 1]就不存在了,但你想要列表中的第一个条目。您可以通过执行以下操作获得相同的+1:$array[($index[$strStartNumber] + 1) % count($array)]

答案 1 :(得分:0)

要旋转数组,您可以使用此循环:

while ($array[0]['tfl_gpac_start'] !== $strStartNumber) {
    $array[] = array_shift($array);
}

请注意,这些数值是字符串 - 您需要严格比较=== / !==,因为在没有类型检查的情况下进行比较时会发生隐式字符串转换的奇怪情况。另一方面,如果没有任何值匹配您将进入无限循环 - 我也要小心。你可以添加一个保护自己的东西:

$count = count($array);
while(... && $count--) {
    ...
}

答案 2 :(得分:0)

您所追求的算法是

  1. 找到项目
  2. 获取该项目并将其删除
  3. 将项目置于顶部
  4. 注意:此代码会改变数组

    <?php
    $strStartNumber = '33';
    $array = array (
        0 => array 
        (
            "tfl_gpac_color" => array(0 => "FF0000"),
            "tfl_gpac_start" => "1",
            "tfl_gpac_end" => "32"
        ),
        1 => array
        (
            "tfl_gpac_color" => array(0 => "0000FF"),
            "tfl_gpac_start" => "33",
            "tfl_gpac_end" => "64"
        ),
        2 => array
        (
            "tfl_gpac_color" => array(0 => "800080"),
            "tfl_gpac_start" => "65",
            "tfl_gpac_end" => "96"
        )
    );
    
    $key = array_search($strStartNumber, array_column($array, 'tfl_gpac_start'));
    if($key)
    {
        $itm = array_splice($array, $key, 1);  
        array_unshift($array, $itm[0]);
    }
    ?>
    <pre><?php var_dump($array); ?></pre>