2017-07-15 34 views
1

我有這樣的多維數組:移動一個數組的元素從開始到結束

$array48= array(
array("2017-06-30-104",1498858541000,39.3322,-122.9027,2.11,0,"U",36) 
); 

OUTPUT:

Array ( 
    [0] => Array ( 
       [0] => 2017-06-30-104 
       [1] => 1498858541000 
       [2] => 39.3322 
       [3] => -122.9027 
       [4] => 2.11 
       [5] => 0 
       [6] => U 
       [7] => 36      
       ) 
    ) 

我想移動$array48[0][0]到結束,i執行此操作:

function id_fine($array_disordinato){ 
    $number= count($array_disordinato); 
    for($a= 0; $a < $number; $a++){ 
     $element= $array_disordinato[$a][0]; 

     unset($array_disordinato[$a][0]); 
     array_push($array_disordinato[$a],$element); 
    } 
    return $array_disordinato; 
} 

id_fine($array48); 

作品,但我不明白爲什麼輸出是:

Array ( 
    [0] => Array ( 
       [1] => 1498858541000 
       [2] => 39.3322 
       [3] => -122.9027 
       [4] => 2.11 
       [5] => 0 
       [6] => U 
       [7] => 36 
       [8] => 2017-06-30-104 
       ) 
    ) 

每個元素的位置都是錯誤的。它應該是:

Array ( 
    [0] => Array (      
       [0] => 1498858541000 
       [1] => 39.3322 
       [2] => -122.9027 
       [3] => 2.11 
       [4] => 0 
       [5] => U 
       [6] => 36 
       [7] => 2017-06-30-104      
       ) 
    ) 
+0

一個數字索引數組中的鍵是持久的,就像關聯數組。如果你刪除一個,那麼它就消失了,直到它再次被設置。如果你想要一個_dynamically_索引數組,請看看'array_values()'函數。 – arkascha

+0

'unset($ array_disordinato [$ a] [0]);',記得嗎? ['unset()'](http://php.net/manual/en/function.unset.php)只是刪除了值,它不會重新索引數組;它甚至不知道你所要求的值是否在數組中,它不會在意,因爲它不關心數組。 ['array_push()'](http://php.net/manual/en/function.array-push.php)也不會重新索引數組。它只是找到最大的數字鍵,增加它並將其存儲在那裏。 – axiac

回答

2

在您id_fine功能使用array_values

$array_disordinato[0] = array_values($array_disordinato[0]); 
return $array_disordinato 
1

您獲得的結果重置數組的數組值,因爲您取消設置的位置(unset($array_disordinato[$a][0]);),因此這個位置已不存在;你想要做的是用新的結果創建一個完整的新陣列。

通過使用你所擁有的,在bloiw代碼將告訴你如何解決這個問題:

$array48= array(
array("2017-06-30-104",1498858541000,39.3322,-122.9027,2.11,0,"U",36) 
); 

function id_fine($array_disordinato) { 
    $number = count ($array_disordinato); 

    for($a= 0; $a < $number; $a++) { 
     $element = $array_disordinato [$a][0]; 

     unset($array_disordinato[$a][0]); 

     // HERE: after you unset the array you want to re-order back so it starts from 0 
     // with this line only you should be fine :) 
     $array_disordinato[$a] = array_values ($array_disordinato[$a]); 

     array_push($array_disordinato[$a],$element); 
    } 

    return $array_disordinato; 
} 

var_dump (id_fine($array48)); 
4

我會建議你使用array_shift移動你的第一個到最後:

array_push($array48[0], array_shift($array48[0])); 

DEMO

或使用:

$array48[0][]= array_shift($array48[0]); 

謝謝Andreas發表評論!

單排會做你想做的:

Array 
(
    [0] => Array 
     (
      [0] => 1498858541000 
      [1] => 39.3322 
      [2] => -122.9027 
      [3] => 2.11 
      [4] => 0 
      [5] => U 
      [6] => 36 
      [7] => 2017-06-30-104 
     ) 

) 

因此,無需複雜的功能id_fineunset然後array_values


DOCS

array_shift()關閉數組的第一個值並將其返回,將數組縮短一個元素並將所有元素向下移動。 所有數字數組鍵將被修改爲從零開始計數而文字鍵不會被觸摸。

+1

不需要array_push要麼'$ array48 [0] [] = array_shift($ array48 [0]);'https://3v4l.org/CbcDT – Andreas

+1

是啊無論哪種方式:) – Thamilan

1

unset($array_disordinato[$a][0]);只是刪除值,它不重新索引數組。它甚至不知道你所要求的值是否在數組中,它根本不在乎,因爲它不關心數組。

array_push($array_disordinato[$a],$element)也不重新索引數組。它只是找到最大的數字鍵,增加它並將其存儲在那裏。

有幾種方法可以實現您的目標。其中之一是在您重新排序值後使用array_values()array_values()忽略現有的數組鍵;它只獲取值併產生從0開始的新索引。

另一種選擇是使用array_slice()而不是unset()。它從數組中提取切片(您需要從索引1直到最後),並且默認情況下,它會重新索引它返回的數組。然後,您可以使用array_push()或只是[]追加你已經保存在$element值:

function id_fine(array $array_disordinato) 
{ 
    // Use the array keys to iterate over the array; it is safer 
    foreach (array_keys($array_disortinato) as $a) { 
     // Copy the first element to the end 
     $array_disordinato[$a][] = $array_disordinato[$a][0]; 
     // Ignore the first element 
     $array_disordinato[$a] = array_slice($array_disordinato[$a], 1); 
    } 

    return $array_disordinato; 
} 
相關問題