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ąć?
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
Jak to osiągnąć?
Odpowiedzi:
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.
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, "
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?
// 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
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));
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));
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
Wypróbuj funkcję PHP array_keys.
$key_string1 = array_keys($list, 'string1');
array_keysróż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));
$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;
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;
}