Uzyskaj wartość indeksu tablicy w PHP


86

Mam tablicę:

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

Chcę uzyskać indeks dla danej wartości (tj. 1Dlastring2 i 2dla string3)

Chcę tylko położenia ciągów w tablicy

  • ciąg1 to 0
  • ciąg2 to 1
  • string3 to 2

Jak to osiągnąć?


7
Mój przyjaciel, pisarz techniczny, powiedział mi: „Nie można uzyskać właściwych odpowiedzi, dopóki nie zadasz właściwych pytań”.
Bill Karwin

to jest stare .... ale chciałbym wiedzieć, dlaczego: „Próbowałem array_search, ale nie było to użyteczne”
dsdsdsdsd

Proszę oznaczyć wyżej ocenioną odpowiedź jako zaakceptowaną.
robsch

Jeśli masz tablicę asocjacyjną, tak jak ja, ta odpowiedź pomaga: stackoverflow.com/a/3365793/470749
Ryan

Odpowiedzi:


157

array_search jest sposób, aby to zrobić.

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

Z dokumentów :

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

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

Możesz ręcznie zapętlić tablicę i znaleźć indeks, ale po co to robić, skoro jest do tego funkcja. Ta funkcja zawsze zwraca klucz i będzie dobrze działać z tablicami asocjacyjnymi i normalnymi.


10
Zwraca klucz, a nie indeks. W twoim przykładzie klucz jest dogodnie indeksem wartości.
Jorge Ferreira

1
@smink, tablica OP jest tablicą nieasocjacyjną, więc działa dobrze.
Matthew Flaschen

przepraszam, nie określiłem typu tablicy. Tablica, której używam, jest tablicą wielowymiarową. Zobacz moją odpowiedź na rozwiązanie
Aakash Chakravarthy

Mam tablicę tego typu: [0 => {id: 1, nazwa: coś}, 1 => {.....}, ...]. czy można znaleźć klucz / indeks, taki jak array_search ("nazwa" => coś, $ tablica)?
lazzy_ms,

A co jeśli tablica ma potomka?
zukijuki

19

Jeśli robisz tylko kilka z nich (i / lub rozmiar tablicy jest duży), to byłeś na dobrej drodze z array_search:

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

Jeśli chcesz je wszystkie (lub dużo), pętla prawdopodobnie zrobi ci lepiej:

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

1
foreach jest tym, czego potrzebowałem
zzapper

11

Inni ludzie sugerowali, array_search()który podaje klucz elementu tablicy, w którym znajduje się wartość. Aby upewnić się, że klucze tablicy są ciągłymi liczbami całkowitymi, użyj array_values():

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

// result: 1

W swoim pytaniu powiedziałeś, że array_search()to nie ma sensu. Czy możesz mi wytłumaczyć dlaczego? Czego próbowałeś i jak to nie spełniało Twoich potrzeb?


„array_values ​​() nie był używany” .. powinno być „array_search () nie był używany”
Vex

7

// lub biorąc pod uwagę strukturę tablicy:

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

// możesz po prostu

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

// wykonane

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

// alternatywnie

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

// rekurencyjnie

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

// wyświetla

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

Problem polega na tym, że nie masz numerycznego indeksu w swojej tablicy.
Użycie array_values ​​() utworzy tablicę indeksowaną przez zero, którą możesz przeszukiwać za pomocą array_search (), omijając potrzebę użycia pętli for.

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

to jak dotąd najkrótsza i
sprawdzona

1

Czy mógłbyś być trochę bardziej szczegółowy?

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

dla mnie działa dobrze. Czy próbujesz osiągnąć coś bardziej złożonego?


1

Ten kod powinien działać tak samo, jak nowa procedura, pracując z poprawną tablicą wielowymiarową.

 $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
Pytanie nie wspomina nic o wielowymiarowych tablicach (komentarze OP w innych odpowiedziach sugerują, że ta odpowiedź jest tym, czego faktycznie szukał, ale jeśli czytasz tylko oryginalne pytanie i tę odpowiedź, to, co mówisz, nie ma sensu)
StubbornShowaGuy

1

Będziesz musiał stworzyć do tego funkcję. Myślę, że nie ma wbudowanej funkcji do tego celu. Wszystkie tablice PHP są domyślnie asocjacyjne. Jeśli więc nie masz pewności co do ich kluczy, oto 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 powinno działać dobrze, właśnie to przetestowałem i zwraca klucze zgodnie z oczekiwaniami:

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

Lub dla indeksu możesz użyć

$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

Oto funkcja, która będzie działać dla indeksów numerycznych lub łańcuchowych. Przekaż tablicę jako pierwszy parametr, następnie indeks do elementu, który ma zostać przesunięty, a na koniec ustaw kierunek na -1, aby przesunąć element w górę i na 1, aby go przesunąć w dół. Przykład: Move (['first' => 'Peter', 'second' => 'Paul', 'third' => 'Kate'], 'second', - 1) przeniesie Pawła w górę, a Piotra w dół.

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;

}

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.