2016-12-06 79 views
0

后排序多维数组我有一个多维数组,我需要给定值(从阵列外部给出)PHP:给定值(而不是从阵列)

这是阵列后进行排序:

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,它应当与同号65

“tfl_gpac_start”首发

为“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" 
) 

非常感谢帮助,我尝试了几种不同的方式,但我不明白的权利.. 。

编辑:所有的值应该在同一个地方(应该保持在一起),所以排序应该只能在第一个数组的键上工作。

+0

这种排序的工作原理还不完全清楚,其他项目如何排序?你想只改变匹配的项目吗? –

+1

所有其他项目应保持原来的顺序。看我的例子和颜色数组。 澄清:项目是为组(有一个颜色,一个起始号码,一个结束号码)。我每个星期都会用不同的数字开始,但组(颜色等)应该是相同的。只是起始号码发生变化。谢谢你的帮助。 – PaddySD

+0

你不能只用一个需要优先的值来排序 - 那么其他团队呢?从例子看来,你旋转数组 - 第一个元素到达最后的位置,直到达到所需的'33'。那是你要的吗? – shudder

回答

0

要旋转阵列您可以使用此循环:

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

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

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

非常感谢,这个伎俩。我不得不用'strval'来改变'$ strStartNumber'的类型,但其他方面像charme一样工作! – PaddySD

0

你不能像这样有效地对数组进行排序。但是,根据您使用数据的方式以及是否可以缓存该数据,您可以重构数据。

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

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

其中0,1,2是原阵列中的索引。现在

ksort($index); 

他们是为了的,你可以通过获取$array[$index[$strStartNumber]]

当你需要得到它后一个得到所有数据的原始数组中为$strStartNumber = 33,您:然后你就可以对它们进行排序可以得到:$array[$index[$strStartNumber] + 1]

但是,它看起来像你可能希望它环路周围,因此如果$strStartNumber = 65然后$array[$index[$strStartNumber] + 1]将不存在,而是希望在列表中的第一个条目来代替。你可以得到具有相同+1这样做:$array[($index[$strStartNumber] + 1) % count($array)]

0

的算法,你追求的是

  1. 找到该项目
  2. 获取该项目,并删除它
  3. 预先设置项顶端

注意:此代码变异数组

<?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>