Как изменить индекс многомерного массива ниже? - PullRequest
1 голос
/ 17 августа 2011

Как изменить этот массив

Array
(
    [0] => Array
    (
        [0] => Array
            (
                [0] => 35.2
            )

        [1] => Array
            (
                [0] => 49.5
            )            

    )

    [1] => Array
    (
        [0] => Array
            (
                [0] => 44
            )

        [1] => Array
            (
                [0] => 38.5
            )

    )
)

на

Array
(
    [0] => Array
    (
        [0] => 35.2             

        [1] =>49.5                            

    )

   [1] => Array
    (
        [0] =>  44                

        [1] => 38.5                

    )

)

Ответы [ 2 ]

2 голосов
/ 17 августа 2011

Простой, легкий способ - это простой вложенный foreach:

// be sure to include the &. Otherwise your edits will do nothing.
foreach( $input as &$level1 )
{
    // level 1 is the array of the arrays which contain your values
    // we need the keys and the arrays which hold the desired values
    foreach( $level1 as $key => $level2 )
    {
       // assign the key to be the value at 0 instead of its current value
       // (which happens to be level2)
       $level1[ $key ] = $level2[ 0 ];
    }
}

Шипи предложил использовать array_merge с call_user_func_array ниже. Это хорошая идея, и я дал ей +1. (Я призываю других сделать то же самое). Чтобы увидеть, что было лучше, я решил запустить тест для обоих решений:

Результаты:

 manual              0.074267864227295
 call_usr_func_array 0.13694596290588
 manual              0.080928087234497
 call_usr_func_array 0.13510608673096

Затем я изменил порядок проверки:

 call_usr_func_array 0.14956903457642
 manual              0.066309928894043
 call_usr_func_array 0.14821600914001
 manual              0.064701080322266

Вот код теста:

$st = microtime(1);
$input = array();
for( $i = 0; $i < 10000; $i++ )
    $input[] = array( array( 1 ),array(  2 ),array(  3 ) );

// be sure to include the &. Otherwise your edits will do nothing.
foreach( $input as &$level1 )
{
    // level 1 is the array of the arrays which contain your values
    // we need the keys and the arrays which hold the desired values
    foreach( $level1 as $key => $level2 )
    {
       // assign the key to be the value at 0 instead of its current value
       // (which happens to be level2)
       $level1[ $key ] = $level2[ 0 ];
    }
}
print microtime(1) - $st;
print PHP_EOL;
$st = microtime(1);
$input = array();
for( $i = 0; $i < 10000; $i++ )
    $input[] = array( array( 1 ),array(  2 ),array(  3 ) );

foreach ( $input as $k => $ary ) {
  $input[$k] = call_user_func_array ( 'array_merge' , $ary );
}
print microtime(1) - $st;
1 голос
/ 17 августа 2011

Вот более короткая версия. Хотя в реальности это все еще вложенный цикл.

foreach ( $input as $k => $ary ) {
  $input[$k] = call_user_func_array ( array_merge , $ary );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...