从头到尾移动数组的元素

时间:2017-07-15 17:10:34

标签: php arrays multidimensional-array

我有这个多维数组:

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

输出:

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]移到最后,我这样做:

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);

有效,但我不明白为什么OUTPUT是:

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

4 个答案:

答案 0 :(得分:5)

我建议您使用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 :(得分:2)

ItemDetailPage.xaml.cs函数中,使用array_values

重置数组的数组值
id_fine

答案 2 :(得分: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));

答案 3 :(得分: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;
}