Nasıl PHP bir dizi reindex mı?

12 Cevap php

Ben çok anahtarları (ideal 1'den başlayarak) ters reindex istiyorum şu dizi var:

Geçerli dizi (edit: dizisi aslında bu gibi görünüyor):

Array (

[2] => Object
    (
        [title] => Section
        [linked] => 1
    )

[1] => Object
    (
        [title] => Sub-Section
        [linked] => 1
    )

[0] => Object
    (
        [title] => Sub-Sub-Section
        [linked] => 
    )

)

Nasıl olmalıdır:

Array (

[1] => Object
    (
        [title] => Section
        [linked] => 1
    )

[2] => Object
    (
        [title] => Sub-Section
        [linked] => 1
    )

[3] => Object
    (
        [title] => Sub-Sub-Section
        [linked] => 
    )

)

12 Cevap

Yeni bir dizi yapmak için OK ise bu var:

$result = array();
foreach ( $array as $key => $val )
    $result[ $key+1 ] = $val;

Eğer yerinde tersine ihtiyacınız varsa, size ihtiyacınız endekslerinde basmayı kalmaz geriye doğru çalıştırmak gerekir:

for ( $k = count($array) ; $k-- > 0 ; )
    $result[ $k+1 ] = $result[ $k ];
unset( $array[0] );   // remove the "zero" element

Yeniden endeksi sıfıra başlayan istiyorsanız, sadece aşağıdakileri yapın:

$iZero = array_values($arr);

Eğer birine başlamak gerekiyorsa, o zaman aşağıdakileri kullanın:

$iOne = array_combine(range(1, count($arr)), array_values($arr));

Burada kullanılan fonksiyonlar için manuel sayfaları:

Here is the best way:

# Array
$array = array('tomato', '', 'apple', 'melon', 'cherry', '', '', 'banana');

Bu döner

Array
(
    [0] => tomato
    [1] => 
    [2] => apple
    [3] => melon
    [4] => Cherry
    [5] => 
    [6] => 
    [7] => banana
)

Bu yaparak

$array = array_values(array_filter($array));

Eğer bu olsun

Array
(
    [0] => tomato
    [1] => apple
    [2] => melon
    [3] => cherry
    [4] => banana
)

Neden

array_values ​​(): sayısal giriş dizideki değerleri ve endeksler döndürür.

array_filter (): Bir kullanıcı tanımlı fonksiyonu ile bir dizinin elemanlarını Filtreler (UDF If none is provided, all entries in the input table valued FALSE will be deleted.)

I apologize for my English, hoping that it will serve you.

Neden yeniden dizin? Sadece endeksi 1 eklenir:

foreach ($array as $key => $val) {
    echo $key + 1, '<br>';
}


Soru açıklığa kavuşturulmuştur sonra Edit:. Siz 0'dan başlayan endeksi sıfırlamak için array_values kullanabilirsiniz Sonra algoritma yukarıdaki kullanabilirsiniz sadece basılı elemanları 1'den başlamak istiyorsanız .

Peki, ben senin nihai hedef ne olursa olsun, aslında 0-tabanlı aksine 1 tabanlı olması diziyi değiştirmeniz gerekmez olacağını düşünmek istiyorum, ama bamya gönderdi gibi yerine yineleme anda ele verebilir.

However, soruyu cevaplamak için, bu fonksiyon 1-tabanlı sürümü içine herhangi bir dizi dönüştürmek gerekir

function convertToOneBased( $arr )
{
    return array_combine( range( 1, count( $arr ) ), array_values( $arr ) );
}

EDIT

Burada bir daha yeniden / esnek fonksiyon bulunuyor, bunu arzu gerekir

$arr = array( 'a', 'b', 'c' );

echo '<pre>';
print_r( reIndexArray( $arr ) );
print_r( reIndexArray( $arr, 1 ) );
print_r( reIndexArray( $arr, 2 ) );
print_r( reIndexArray( $arr, 10 ) );
print_r( reIndexArray( $arr, -10 ) );
echo '</pre>';

function reIndexArray( $arr, $startAt=0 )
{
    return ( 0 == $startAt )
    	? array_values( $arr )
    	: array_combine( range( $startAt, count( $arr ) + ( $startAt - 1 ) ), array_values( $arr ) );
}

Bu ne istediğinizi yapacağız:

<?php

$array = array(2 => 'a', 1 => 'b', 0 => 'c');

array_unshift($array, false); // Add to the start of the array
$array = array_values($array); // Re-number

// Remove the first index so we start at 1
$array = array_slice($array, 1, count($array), true);

print_r($array); // Array ( [1] => a [2] => b [3] => c ) 

?>

Sen hiç bir 1-tabanlı dizi kullanmak istiyorum neden düşünebilirsiniz. Sıfır tabanlı diziler (non-ilişkisel diziler kullanılarak) oldukça standart ve bir UI çıktı isteyen iseniz, çoğu sadece UI çıkışı üzerine tamsayı artırarak çözüm işlemek olur.

Tutarlılık-hem uygulama ve ile-zaman diziler için yaklaşık 1-tabanlı dizinleyiciler düşünmeye çalışmak kodu düşünün.

Yeni dizi böyle 1 bir dizin ile başlar böylece bir dizi reindex yapabilirsiniz;

$arr = array(
  '2' => 'red',
  '1' => 'green',
  '0' => 'blue',
);

$arr1 = array_values($arr);   // Reindex the array starting from 0.
array_unshift($arr1, '');     // Prepend a dummy element to the start of the array.
unset($arr1[0]);              // Kill the dummy element.

print_r($arr);
print_r($arr1);

Yukarıda elde edilen çıkışı;

Array
(
    [2] => red
    [1] => green
    [0] => blue
)
Array
(
    [1] => red
    [2] => green
    [3] => blue
)

duplicate removal and reindex an array:

<?php

$ Eskidizi = array ('0 '=>' php ', '1' => 'java', '2 '=>'', '3' => 'asp', '4 '=>'', '5 '=>' mysql ');

//duplicate removal $fillteredArray = array_filter($oldArray);

//reindexing actually happens here $newArray = array_merge($filteredArray);

print_r ($ yeni_dizi);

?>

@ Monowerker benzer, ben bir nesnenin anahtarı kullanarak bir dizi reindex gerekiyordu ...

$new = array();
$old = array(
  (object)array('id' => 123),
  (object)array('id' => 456),
  (object)array('id' => 789),
);
print_r($old);

array_walk($old, function($item, $key, &$reindexed_array) {
  $reindexed_array[$item->id] = $item;
}, &$new);

print_r($new);

Bu sonuçlandı:

Array
(
    [0] => stdClass Object
        (
            [id] => 123
        )
    [1] => stdClass Object
        (
            [id] => 456
        )
    [2] => stdClass Object
        (
            [id] => 789
        )
)
Array
(
    [123] => stdClass Object
        (
            [id] => 123
        )
    [456] => stdClass Object
        (
            [id] => 456
        )
    [789] => stdClass Object
        (
            [id] => 789
        )
)

Sadece de yapabilirsiniz öğrendim

array_splice($ar, 0, 0);

Yani yeniden endeksleme INPLACE yapar, böylece orijinal dizinin bir kopyası ile bitmiyor.

Sıralama sadece bir sort(), endeksleme biraz saçma görünüyor ama gerekli eğer bu bunu yapmak olacaktır. Olsa değil yerinde. Eğer yerlerde bir demet yapacak eğer bu bir kerelik bir işlem ise sadece uyumak için bir anahtar-değer döngü kullanmak, array_walk() kullanın.

<?php

function reindex(&$item, $key, &$reindexedarr) {
    $reindexedarr[$key+1] = $item;
}

$arr = Array (2 => 'c', 1 => 'b', 0 => 'a');

sort($arr);
$newarr = Array();
array_walk($arr, reindex, &$newarr);
$arr = $newarr;
print_r($arr); // Array ( [1] => a [2] => b [3] => c )

?>