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.
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:
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():
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?
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.
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";
functionarray_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
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ół.
Odpowiedzi:
array_search
jest sposób, aby to zrobić.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.
źródło
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, "
źródło
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żyjarray_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?źródło
// 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
źródło
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));
źródło
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?
źródło
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));
źródło
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
źródło
Wypróbuj funkcję PHP array_keys.
$key_string1 = array_keys($list, 'string1');
źródło
array_keys
różni się odarray_search
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));
źródło
$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;
źródło
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;
}
źródło