2016-12-06 32 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>