PHP функция для изменения порядка массива - PullRequest
2 голосов
/ 23 августа 2009

Вот пример массива всех внешних файлов JS с paypal.com:

.
Array
(
    [src] => Array
        (
            [1] => https://www.paypalobjects.com/WEBSCR-590-20090814-1/js/lib/min/global.js
            [2] => https://www.paypalobjects.com/WEBSCR-590-20090814-1/js/tns/mid.js
            [8] => https://www.paypalobjects.com/WEBSCR-590-20090814-1/js/opinionlab/oo_engine.js
            [11] => https://www.paypalobjects.com/WEBSCR-590-20090814-1/js/iconix.js
            [12] => https://www.paypalobjects.com/WEBSCR-590-20090814-1/js/pageBlockingUnsafeBrowsers.js
            [13] => https://www.paypalobjects.com/js/tns/min/bid.js
            [15] => https://www.paypalobjects.com/WEBSCR-590-20090814-1/js/pp_naturalsearch.js
            [17] => https://www.paypalobjects.com/WEBSCR-590-20090814-1/js/site_catalyst/pp_jscode_080706.js
        )

    [size] => Array
        (
            [1] => 0.273
            [2] => 0.266
            [8] => 0.279
            [11] => 0.265
            [12] => 0.285
            [13] => 0.248
            [15] => 0.275
            [17] => 0.289
        )

)

Существуют ли встроенные функции для PHP или пользовательские, которые могут переупорядочивать этот массив в этом (без ущерба для производительности):

Array
(
    [src] => Array
        (
            [1] => https://www.paypalobjects.com/WEBSCR-590-20090814-1/js/lib/min/global.js
            [2] => https://www.paypalobjects.com/WEBSCR-590-20090814-1/js/tns/mid.js
            [3] => https://www.paypalobjects.com/WEBSCR-590-20090814-1/js/opinionlab/oo_engine.js
            [4] => https://www.paypalobjects.com/WEBSCR-590-20090814-1/js/iconix.js
            [5] => https://www.paypalobjects.com/WEBSCR-590-20090814-1/js/pageBlockingUnsafeBrowsers.js
            [6] => https://www.paypalobjects.com/js/tns/min/bid.js
            [7] => https://www.paypalobjects.com/WEBSCR-590-20090814-1/js/pp_naturalsearch.js
            [8] => https://www.paypalobjects.com/WEBSCR-590-20090814-1/js/site_catalyst/pp_jscode_080706.js
        )

    [size] => Array
        (
            [1] => 0.273
            [2] => 0.266
            [3] => 0.279
            [4] => 0.265
            [5] => 0.285
            [6] => 0.248
            [7] => 0.275
            [8] => 0.289
        )

)

Ответы [ 5 ]

10 голосов
/ 23 августа 2009

Эта функция должна работать, и это настолько просто, насколько это возможно.

function reindex_array($src) {
    $dest = array();

    foreach ($array as $key => $value) {
        if (is_array($value)) {
           foreach ($value as $dest_val) {
               $dest[$key][] = $dest_val;
           }
        }
    }

    return $dest;
}

Использование array_values ​​(), как предложено в Ответ Хенрика

function reindex_array($src) {
    $dest = array();

    foreach ($array as $key => $value) {
        if (is_array($value)) {
           $dest[$key] = array_values($value);
        }
    }

    return $dest;
}

Это сделает индекс массива основанным на 0. Если вы хотите индексирование на основе 1, используйте следующее:

function reindex_array($src) {
    $dest = array();

    foreach ($array as $key => $value) {
        if (is_array($value)) {
           $count = 1;

           foreach ($value as $dest_val) {
               $dest[$key][$count] = $dest_val;
               $count++;
           }
        }
    }

    return $dest;
}
8 голосов
/ 23 августа 2009

РЕДАКТИРОВАТЬ: Сначала я не заметил вложенности массива, поэтому следующего недостаточно. Поскольку Имран уже включил мое предложение, я не буду редактировать его дальше.


Проверьте функцию array_values ​​() , она делает почти то, что вам нужно.

Единственное отличие от желаемого результата в том, что он переиндексирует, начиная с нуля - если вам действительно нужно, чтобы индекс начинался с единицы, вы можете array_shift() пустую запись сначала, а array_unshift() потом.

2 голосов
/ 19 марта 2013

Вы можете просто использовать функцию array_values, она очень проста в использовании и это всего лишь один метод / функция.

// The array
$array = array(0 => "value", 3 => "value", 8 => "value");

// Reorder the array
$array = array_values($array); 

Надеюсь, это поможет!

2 голосов
/ 24 августа 2009

, если вы действительно хотите, чтобы каждый подмассив начинался с индекса 1, используйте это:

foreach($inputarray as &$a)
    $a = array_combine(range(1,count($a)),$a);

для запуска каждого индекса подмассива с индекса 0 используйте это ...

foreach($inputarray as &$a)
    $a = array_values($a);

PHP ссылка:
array_combine
Диапазон
array_values ​​

0 голосов
/ 23 августа 2009

Мой лучший выстрел, на данный момент (быстрая и не проверенная попытка)

$i = 1;    
foreach($src as $key=>$item) {
    if ($i != $key) {
        $src[$i] = $src[$key];
        $size[$i] = $size[$key];
        unset($src[$key]];
        unset($size[$key]];
    }
    $i++; 
}

Но зачем вам прибегать к массивам? Цикл их через foreach ($ array as $ key => $ value) отлично работает в этом контексте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...