PHP'de bir dizideki belirli bir değerin dizinini alın


87

Bir dizim var:

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

Belirli bir değer için indeksi almak istiyorum (yani 1için string2ve 2için string3)

Tek istediğim dizideki dizelerin konumu

  • string1, 0'dır
  • string2 1'dir
  • string3 2'dir

Bunu nasıl başarabilirim?


8
Bir teknoloji yazarı arkadaşım bana şöyle dedi: "Doğru soruları sormadan doğru cevapları alamazsınız."
Bill Karwin

bu eski .... ama nedenini öğrenmek istiyorum: "array_search denedim ama
faydası olmadı

Lütfen, daha yüksek derecelendirilen yanıtı kabul edildi olarak işaretleyin.
robsch

Bir ilişkisel diziniz varsa, benim yaptığım gibi, bu cevap yardımcı olur: stackoverflow.com/a/3365793/470749
Ryan

Yanıtlar:


159

array_search bunu yapmanın yolu.

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

Gönderen docs :

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

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

El ile dizi üzerinden dönüp dizini bulabilirsin ama bunun için bir işlev varken neden yapıyorsun? Bu işlev her zaman bir anahtar döndürür ve ilişkisel ve normal dizilerle iyi çalışacaktır.


11
Bu, dizini değil anahtarı döndürür. Örneğinizde anahtar uygun bir şekilde değerin indeksidir.
Jorge Ferreira

1
@smink, OP'nin dizisi ilişkisel olmayan bir dizidir, bu yüzden iyi çalışıyor.
Matthew Flaschen

üzgünüm dizinin türünü belirtmedim. Kullandığım dizi çok boyutlu bir dizi, lütfen çözüm için
cevabıma

Bu tür bir diziye sahibim: [0 => {id: 1, ad: bir şey}, 1 => {.....}, ...]. array_search ("name" => bir şey, $ dizi) gibi anahtar / dizin bulmak mümkün mü?
lazzy_ms

Dizinin çocuğu varsa nasıl olur?
zukijuki

19

Sadece birkaçını yapıyorsanız (ve / veya dizi boyutu büyükse), dizi_arama ile doğru yoldasınız demektir:

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

Hepsini (veya çoğunu) istiyorsanız, bir döngü daha iyi yapacaktır:

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

1
foreach benim ihtiyacım olan şey
zzapper

11

Diğerleri array_search(), değerin bulunduğu dizi elemanının anahtarını veren öneride bulundu. Şunları kullanarak dizi anahtarlarının bitişik tam sayı olduğundan emin olabilirsiniz array_values():

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

// result: 1

Sorunuzda array_search()faydası olmadığını söylediniz . Nedenini açıklayabilir misin? Neyi denediniz ve ihtiyaçlarınızı nasıl karşılamadı?


"array_values ​​() işe yaramadı" .. olmalı "array_search () kullanılmadı"
Vex

7

// veya dizi yapınızı dikkate alarak:

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

// sadece yapabilirdin

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

// yürütüldü

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

// alternatif olarak

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

// özyinelemeli

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

// çıktılar

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

6

Sorun, dizinizde sayısal bir indeksin olmamasıdır.
Array_values ​​() kullanmak, daha sonra bir for döngüsü kullanma ihtiyacını atlayarak array_search () kullanarak arayabileceğiniz sıfır indisli bir dizi oluşturur.

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

bu, şu ana kadar soru için en kısa ve işe yarayan yöntemdir
Toni Tegar Sahidi

1

Biraz daha açık konuşabilir misin?

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

benim için iyi çalışıyor. Daha karmaşık bir şey başarmaya mı çalışıyorsunuz?


1

Bu kod, doğru çok boyutlu diziyle çalışarak yeni rutininizin aynısını yapmalıdır ..

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

1
Soru, çok boyutlu diziler hakkında hiçbir şeyden bahsetmiyor (diğer yanıtlarda OP tarafından yapılan yorumlar, bu cevabın aslında aradığı şey olduğunu gösteriyor, ancak sadece orijinal soruyu ve bu cevabı okursanız, söylediklerinizin hiçbir anlamı yok)
StubbornShowaGuy

1

Bunun için bir işlev oluşturmanız gerekecek. Bu amaç için yerleşik bir işlev olduğunu sanmıyorum. Tüm PHP dizileri varsayılan olarak ilişkilidir. Yani, anahtarlarından emin değilseniz, işte kod:

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



0

array_search iyi çalışmalı, sadece bunu test etmelidir ve beklendiği gibi anahtarları döndürür:

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

Veya dizin için kullanabilirsiniz

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

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;

-1

Sayısal veya dize indeksleri için çalışacak bir fonksiyon. İlk parametre olarak diziyi, ardından taşınması gereken öğenin dizini geçirin ve son olarak, öğeyi yukarı taşımak için yönü -1'e ve aşağı taşımak için 1'e ayarlayın. Örnek: Taşı (['birinci' => 'Peter', 'ikinci' => 'Paul', 'üçüncü' => 'Kate'], 'ikinci', - 1) Paul'u yukarı ve Peter'ı aşağı hareket ettirecektir.

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;

}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.