PHP bir dizi yeniden düzenlemek için işlev

5 Cevap php

İşte paypal.com tüm harici JS dosyaları örnek bir dizidir:

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
        )

)

Var mı PHP, ya da (ya isabet büyük bir performans olmadan) bu bu diziyi yeniden düzenleyebilirsiniz özel fonksiyon olarak inşa edilmiştir:

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 Cevap

Bu fonksiyon çalışması gerekir ve bu da olsun gibi basittir.

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

Henrik's answer önerildiği gibi array_values ​​() kullanarak

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

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

    return $dest;
}

Bu dizi indeksi rağmen 0-tabanlı yapacaktır. Eğer 1-tabanlı dizin istiyorsanız, o zaman bu kullanın:

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

EDIT: Ben dizi ilk yuvalama fark etmedi, bu nedenle aşağıdaki yeterli değildir. Imran zaten benim önerim dahil olarak, ben daha fazla bu düzenleme olmaz.


array_values() fonksiyonunu kontrol edin, neredeyse tam olarak ihtiyacınız nedir.

Eğer gerçekten birinde başlamak endeksi gerekiyorsa ilk yapabilirsiniz array_shift() bir kukla giriş, ve array_unshift() bunu - İstediğiniz çıktı tek farkı sıfır ile başlayan reindexes olduğunu sonra.

gerçekten her altdizilim indeksi 1 kullanıma başlamak istiyorsanız bu:

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

0 dizin her altdizilim endeksi başlatmak için kullanabilir ...

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


PHP reference:
array_combine
range
array_values

Sadece array_values işlevini kullanabilirsiniz, kullanımı çok kolay ve sadece tek bir yöntem / fonksiyon.

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

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

Bu yardımcı olur umarım!

Şu an için benim en iyi atış, (hızlı ve denenmemiş girişimi)

$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++; 
}

Ama neden diziler başvurmak gerekiyor? foreach ($array as $key=>$value) ile yalak loop bu bağlamda çalışıyor.