Penggunaan fungsi PREPENDS pada PHP

Saya memiliki larik berikut, yang ingin saya isi ulang sehingga kuncinya terbalik (idealnya dimulai dari 1):

Array saat ini ( edit: array sebenarnya terlihat seperti ini):

Array (

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

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

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

)

Bagaimana seharusnya:

Array (

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

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

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

)

Jika Anda ingin mengindeks ulang mulai dari nol, cukup lakukan hal berikut:

$iZero = array_values($arr);

Jika Anda perlu memulainya pada satu, maka gunakan yang berikut ini:

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

Berikut adalah halaman manual untuk fungsi yang digunakan:

  • array_values()
  • array_combine()
  • range()

Inilah cara terbaik :

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

itu kembali

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

dengan melakukan ini

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

kamu mendapatkan ini

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

Penjelasan

array_values(): Mengembalikan nilai array input dan indeks secara numerik.

array_filter(): Memfilter elemen array dengan fungsi yang ditentukan pengguna (UDF Jika tidak ada yang disediakan , semua entri dalam tabel input yang bernilai FALSE akan dihapus .)

Saya baru tahu Anda juga dapat melakukan

array_splice($ar, 0, 0);

Itu melakukan pengindeksan ulang di tempat, sehingga Anda tidak berakhir dengan salinan array asli.

Mengapa mengindeks ulang? Cukup tambahkan 1 ke indeks:

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

Edit Setelah pertanyaan diklarifikasi: Anda bisa menggunakan array_values untuk mengatur ulang indeks mulai dari 0. Kemudian Anda dapat menggunakan algoritma di atas jika Anda hanya ingin elemen cetak dimulai pada 1.

Yah, saya ingin berpikir bahwa untuk apa pun tujuan akhir Anda, Anda sebenarnya tidak perlu mengubah array menjadi berbasis 1 sebagai lawan dari berbasis 0, tetapi sebaliknya bisa menanganinya pada waktu iterasi seperti yang diposting Gumbo.

Namun , untuk menjawab pertanyaan Anda, fungsi ini harus mengubah array apa pun menjadi versi berbasis 1

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

EDIT

Inilah fungsi yang lebih dapat digunakan kembali/fleksibel, jika Anda menginginkannya

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

Anda dapat mengindeks ulang array sehingga array baru dimulai dengan indeks 1 seperti ini;

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

Output dari di atas adalah;

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

Ini akan melakukan apa yang Anda inginkan:

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

?>

Solusi yang lebih elegan:

$list = array_combine(range(1, count($list)), array_values($list));

Mirip dengan @monowerker, saya perlu mengindeks ulang array menggunakan kunci objek ...

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

Ini menghasilkan:

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

Anda mungkin ingin mempertimbangkan mengapa Anda ingin menggunakan array berbasis 1 sama sekali. Array berbasis nol (ketika menggunakan array non-asosiatif) cukup standar, dan jika Anda ingin output ke UI, sebagian besar akan menangani solusi dengan hanya meningkatkan integer setelah output ke UI.

Pikirkan tentang konsistensi — baik dalam aplikasi Anda dan dalam kode yang Anda gunakan — ketika memikirkan pengindeks 1 berbasis untuk array.

Jika Anda tidak mencoba menyusun ulang array, Anda cukup melakukannya:

$ array = array_reverse ($ array);
$ array = array_reverse ($ array);

The array_reverse sangat cepat dan akan menata ulang ketika membalikkan. Orang lain sudah lama menunjukkan ini pada saya. Jadi saya tidak bisa mengambil kredit untuk datang dengan itu. Tetapi sangat sederhana dan cepat.

$tmp = array();
foreach (array_values($array) as $key => $value) {
    $tmp[$key+1] = $value;
}
$array = $tmp;

penghapusan duplikat dan indeks ulang array:

<?php  
   $oldArray = 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($newArray);
?>

Inilah implementasi saya sendiri. Kunci dalam array input akan dinomori ulang dengan penambahan kunci mulai dari $ start_index.

function array_reindex($array, $start_index)
{
    $array = array_values($array);
    $zeros_array = array_fill(0, $start_index, null);
    return array_slice(array_merge($zeros_array, $array), $start_index, null, true);
}

Penyortiran hanyalah sort () , pengindeksan ulang tampak agak konyol tetapi jika diperlukan ini akan melakukannya. Meski tidak di tempat. Gunakan array_walk () jika Anda akan melakukan ini di banyak tempat, gunakan saja for-key-value loop jika ini adalah operasi satu kali.

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

?>

Mirip dengan kontribusi Nick, saya datang ke solusi yang sama untuk mengindeks ulang array, tetapi sedikit meningkatkan fungsi sejak dari PHP versi 5.4, itu tidak berfungsi karena meneruskan variabel dengan referensi. Contoh fungsi pengindeksan ulang adalah seperti ini menggunakan penutupan kata kunci use:

function indexArrayByElement($array, $element)
{
    $arrayReindexed = [];
    array_walk(
        $array,
        function ($item, $key) use (&$arrayReindexed, $element) {
            $arrayReindexed[$item[$element]] = $item;
        }
    );
    return $arrayReindexed;
}

Cukup lakukan ini:

<?php

array_Push($array, '');
$array = array_reverse($array);
array_shift($array);

Anda dapat dengan mudah melakukannya setelah menggunakan fungsi array_values ​​() dan array_filter () bersama-sama untuk menghapus elemen array kosong dan pengindeksan ulang dari array dalam PHP.

Fungsi array_filter () Fungsi PHP array_filter () menghapus elemen atau nilai array kosong dari array dalam PHP. Ini juga akan menghapus nilai kosong, nol, salah, 0 (nol).

Fungsi array_values ​​() Fungsi PHP array_values ​​() mengembalikan array yang berisi semua nilai array. Array yang dikembalikan akan memiliki tombol angka, mulai dari 0 dan bertambah 1.

Hapus Elemen Array Kosong dan Reindex

Pertama mari kita lihat output array $ stack:

<?php
  $stack = array("PHP", "HTML", "CSS", "", "JavaScript", null, 0);
  print_r($stack);
?>

Output:

Array
(
    [0] => PHP
    [1] => HTML
    [2] => CSS
    [3] => 
    [4] => JavaScript
    [5] => 
    [6] => 0
)

Dalam output di atas kami ingin menghapus nilai kosong, nol, 0 (nol) dan kemudian memasukkan kembali elemen array. Sekarang kita akan menggunakan fungsi array_values ​​() dan array_filter () bersama-sama seperti dalam contoh di bawah ini:

<?php
  $stack = array("PHP", "HTML", "CSS", "", "JavaScript", null, 0);
  print_r(array_values(array_filter($stack)));
?>

Output:

Array
(
    [0] => PHP
    [1] => HTML
    [2] => CSS
    [3] => JavaScript
)