Dapatkan indeks nilai tertentu dalam array di PHP

87

Saya memiliki array:

$list = array('string1', 'string2', 'string3');

Saya ingin mendapatkan indeks untuk nilai yang diberikan (yaitu 1untuk string2dan 2untuk string3)

Yang saya inginkan hanyalah posisi string dalam array

  • string1 adalah 0
  • string2 adalah 1
  • string3 adalah 2

Bagaimana cara mencapai ini?

Aakash Chakravarthy
sumber
8
Seorang teman penulis teknologi saya mengatakan kepada saya: "Anda tidak bisa mendapatkan jawaban yang benar kecuali jika Anda mengajukan pertanyaan yang tepat."
Bill Karwin
ini sudah tua .... tapi saya ingin tahu mengapa: "Saya mencoba array_search tetapi tidak ada gunanya"
dsdsdsdsd
Tolong, tandai jawaban berperingkat lebih tinggi sebagai diterima.
robsch
Jika Anda memiliki array asosiatif, seperti yang saya lakukan, jawaban ini membantu: stackoverflow.com/a/3365793/470749
Ryan

Jawaban:

159

array_search adalah cara untuk melakukannya.

array_search ( mixed $needle , array $haystack [, bool $strict = FALSE ] ) : mixed

Dari dokumen :

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

$key = array_search('green', $array); // $key = 2;
$key = array_search('red', $array);   // $key = 1;

Anda dapat mengulang array secara manual dan menemukan indeksnya tetapi mengapa melakukannya ketika ada fungsi untuk itu. Fungsi ini selalu mengembalikan kunci dan akan bekerja dengan baik dengan array asosiatif dan normal.

RaYell
sumber
11
Ini mengembalikan kunci, bukan indeks. Dalam contoh Anda, kuncinya adalah indeks nilainya.
Jorge Ferreira
1
@smink, array OP adalah array non-asosiatif, jadi ini berfungsi dengan baik.
Matthew Flaschen
maaf, saya tidak menentukan jenis array. Array yang saya gunakan adalah array multi-dimensi, silakan lihat jawaban saya untuk solusinya
Aakash Chakravarthy
Saya memiliki tipe array ini: [0 => {id: 1, name: something}, 1 => {.....}, ...]. apakah ini mungkin untuk menemukan kunci / indeks seperti array_search ("name" => something, $ array)?
lazzy_ms
Bagaimana jika array memiliki anak?
zukijuki
19

Jika Anda hanya melakukan beberapa di antaranya (dan / atau ukuran arraynya besar), Anda berada di jalur yang benar dengan array_search:

$list = array('string1', 'string2', 'string3');
$k = array_search('string2', $list); //$k = 1;

Jika Anda menginginkan semua (atau banyak dari mereka), sebuah loop akan membantu Anda lebih baik:

foreach ($list as $key => $value) {
    echo $value . " in " . $key . ", ";
}
// Prints "string1 in 0, string2 in 1, string3 in 2, "
ircmaxell
sumber
1
muka
11

Orang lain telah menyarankan array_search()yang memberikan kunci elemen array di mana nilainya ditemukan. Anda dapat memastikan bahwa kunci array adalah bilangan bulat yang berdekatan dengan menggunakan array_values():

$list = array(0=>'string1', 'foo'=>'string2', 42=>'string3');
$index = array_search('string2', array_values($list));
print "$index\n";

// result: 1

Anda mengatakan dalam pertanyaan Anda array_search()itu tidak ada gunanya. Bisakah Anda menjelaskan mengapa? Apa yang Anda coba dan bagaimana itu tidak memenuhi kebutuhan Anda?

Bill Karwin
sumber
"array_values ​​() tidak ada gunanya" .. seharusnya "array_search () tidak ada gunanya"
Vex
7

// atau mempertimbangkan struktur array Anda:

$array = array(
  'string1' => array('a' => '', 'b' => '', 'c' => ''),
  'string2' => array('a' => '', 'b' => '', 'c' => ''),
  'string3' => array('a' => '', 'b' => '', 'c' => ''),
);

// kamu bisa saja

function findIndexOfKey($key_to_index,$array){
  return array_search($key_to_index,array_keys($array));
}

// dieksekusi

print "\r\n//-- Method 1 --//\r\n";
print '#index of: string1 = '.findIndexofKey('string1',$array)."\r\n";
print '#index of: string2 = '.findIndexofKey('string2',$array)."\r\n";
print '#index of: string3 = '.findIndexofKey('string3',$array)."\r\n";

// kalau tidak

print "\r\n//-- Method 2 --//\r\n";
print '#index of: string1 = '.array_search('string1',array_keys($array))."\r\n";
print '#index of: string2 = '.array_search('string2',array_keys($array))."\r\n";
print '#index of: string3 = '.array_search('string3',array_keys($array))."\r\n";

// secara rekursif

print "\r\n//-- Method 3 --//\r\n";
foreach(array_keys($array) as $key => $value){
  print '#index of: '.$value.' = '.$key."\r\n";
}

// keluaran

//-- Method 1 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2

//-- Method 2 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2

//-- Method 3 --//
#index of: string1 = 0
#index of: string2 = 1
#index of: string3 = 2
Michael Hurley
sumber
6

Masalahnya adalah Anda tidak memiliki indeks numerik pada array Anda.
Menggunakan array_values ​​() akan membuat array berindeks nol yang kemudian dapat Anda cari menggunakan array_search () tanpa perlu menggunakan perulangan for.

$list = array('string1', 'string2', 'string3');
$index = array_search('string2',array_values($list));
Brian Berneker
sumber
Sejauh ini, ini adalah metode terpendek dan berhasil untuk pertanyaan itu,
Toni Tegar Sahidi
1

Bisakah Anda lebih spesifik?

$key = array_search('string2',$list)

bekerja dengan baik untuk saya. Apakah Anda mencoba mencapai sesuatu yang lebih kompleks?

Jeff
sumber
1

Kode ini harus melakukan hal yang sama seperti rutinitas baru Anda, bekerja dengan larik multi-dimensi yang benar ..

 $arr = array(
  'string1' => array('a' => '', 'b' => '', 'c' => ''),
  'string2' => array('a' => '', 'b' => '', 'c' => ''),
  'string3' => array('a' => '', 'b' => '', 'c' => '')
 );

 echo 'Index of "string2" = '. array_search('string2', array_keys($arr));
Menyusahkan
sumber
1
Pertanyaan tersebut tidak menyebutkan apa-apa tentang array multi-dimensi (komentar oleh OP dalam jawaban lain menunjukkan bahwa jawaban ini adalah yang sebenarnya dia cari, tetapi jika Anda hanya membaca pertanyaan asli dan jawaban ini, apa yang Anda katakan tidak masuk akal)
StubbornShowaGuy
1

Anda harus membuat fungsi untuk ini. Saya rasa tidak ada fungsi bawaan untuk tujuan itu. Semua array PHP asosiatif secara default. Jadi, jika Anda tidak yakin tentang kuncinya, berikut kodenya:

<?php

$given_array = array('Monday' => 'boring',
'Friday' => 'yay',
'boring',
'Sunday' => 'fun',
7 => 'boring',
'Saturday' => 'yay fun',
'Wednesday' => 'boring',
'my life' => 'boring');

$repeating_value = "boring";

function array_value_positions($array, $value){
    $index = 0;
    $value_array = array();
        foreach($array as $v){
            if($value == $v){
                $value_array[$index] = $value;
            }
        $index++;
        }
    return $value_array;
}

$value_array = array_value_positions($given_array, $repeating_value);

$result = "The value '$value_array[0]' was found at these indices in the given array: ";

$key_string = implode(', ',array_keys($value_array));

echo $result . $key_string . "\n";//Output: The value 'boring' was found at these indices in the given array: 0, 2, 4, 6, 7

Krish PG
sumber
0

Coba fungsi PHP array_keys.

$key_string1 = array_keys($list, 'string1');
Evernoob
sumber
bukankah parameter itu dibalik ?
ashleedawg
@ashleedawg Tidak, Anda salah membaca, array_keysberbeda denganarray_search
Teman
0

array_search seharusnya berfungsi dengan baik, cukup uji ini dan ini mengembalikan kunci seperti yang diharapkan:

$list = array('string1', 'string2', 'string3');
echo "Key = ".array_search('string1', $list);
echo " Key = ".array_search('string2', $list);
echo " Key = ".array_search('string3', $list);

Atau untuk indeks, Anda bisa menggunakan

$list = array('string1', 'string2', 'string3');
echo "Index = ".array_search('string1', array_merge($list));
echo " Index = ".array_search('string2', array_merge($list));
echo " Index = ".array_search('string3', array_merge($list));
Menyusahkan
sumber
0
$find="Topsite";
$list=array("Tope","Ajayi","Topsite","Infotech");
$list_count=count($list);
sort($list);
for($i=0;$i<$list_count;$i++)
{
    if($list[$i]==$find){
         $position=$i;
    }

}
echo $position;
Ajayi Temitope
sumber
-1

Berikut adalah fungsi yang akan berfungsi untuk indeks numerik atau string. Teruskan array sebagai parameter pertama, lalu indeks ke elemen yang perlu dipindahkan dan terakhir atur arah ke -1 untuk memindahkan elemen ke atas dan ke 1 untuk memindahkannya ke bawah. Contoh: Pindahkan (['first' => 'Peter', 'second' => 'Paul', 'third' => 'Kate'], 'second', - 1) akan memindahkan Paul ke atas dan Peter ke bawah.

function Move($a,$element,$direction)
{

$temp = [];
$index = 0;

foreach($a as $key=>$value)
{
    $temp[$index++] = $key;
}

$index = array_search($element,$temp);

$newpos = $index+$direction;

if(isset($temp[$newpos]))
{
        $value2 = $temp[$newpos];
        $temp[$newpos]=$element;
        $temp[$index]=$value2;
}
else
{
    # move is not possible
    return $a; # returns the array unchanged
}   

$final = [];

foreach($temp as $next)
{
    $final[$next]=$a[$next];
}

return $final;

}

JG Estiot
sumber