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

Aakash Chakravarthy
źródło
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.

RaYell
źródło
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, "
ircmaxell
źródło
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?

Bill Karwin
źródło
„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
Michael Hurley
źródło
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));
Brian Berneker
źródło
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?

Jeff
źródło
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));
Drażnić
źródło
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

Krish PG
źródło
0

Wypróbuj funkcję PHP array_keys.

$key_string1 = array_keys($list, 'string1');
Evernoob
źródło
czy te parametry nie są odwrócone ?
ashleedawg
@ashleedawg Nie, źle przeczytałeś, array_keysróżni się odarray_search
A Friend
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));
Drażnić
źródło
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
źródło
-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;

}

JG Estiot
źródło