У меня есть массив:
$list = array('string1', 'string2', 'string3');
Я хочу получить индекс для данного значения (т.е. 1
дляstring2
и 2
для string3
)
Все, что мне нужно, это положение строк в массиве
- строка1 равна 0
- строка2 равна 1
- string3 равно 2
Как этого добиться?
Ответы:
array_search
способ сделать это.Из документов :
$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red'); $key = array_search('green', $array); // $key = 2; $key = array_search('red', $array); // $key = 1;
Вы можете перебрать массив вручную и найти индекс, но зачем это делать, если для этого есть функция. Эта функция всегда возвращает ключ и хорошо работает с ассоциативными и обычными массивами.
источник
Если вы выполняете только несколько из них (и / или размер массива большой), значит, вы были на правильном пути с array_search:
$list = array('string1', 'string2', 'string3'); $k = array_search('string2', $list); //$k = 1;
Если вам нужны все (или много), возможно, вам подойдет цикл:
foreach ($list as $key => $value) { echo $value . " in " . $key . ", "; } // Prints "string1 in 0, string2 in 1, string3 in 2, "
источник
Другие люди предложили,
array_search()
что дает ключ элемента массива, в котором находится значение. Вы можете гарантировать, что ключи массива являются непрерывными целыми числами, используяarray_values()
:$list = array(0=>'string1', 'foo'=>'string2', 42=>'string3'); $index = array_search('string2', array_values($list)); print "$index\n"; // result: 1
Вы сказали в своем вопросе, что
array_search()
это бесполезно. Вы можете объяснить почему? Что вы пробовали и почему это не соответствовало вашим потребностям?источник
// или учитывая структуру вашего массива:
$array = array( 'string1' => array('a' => '', 'b' => '', 'c' => ''), 'string2' => array('a' => '', 'b' => '', 'c' => ''), 'string3' => array('a' => '', 'b' => '', 'c' => ''), );
// вы могли бы просто
function findIndexOfKey($key_to_index,$array){ return array_search($key_to_index,array_keys($array)); }
// выполнено
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";
// альтернативно
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";
// рекурсивно
print "\r\n//-- Method 3 --//\r\n"; foreach(array_keys($array) as $key => $value){ print '#index of: '.$value.' = '.$key."\r\n"; }
// выводит
//-- 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
источник
Проблема в том, что в вашем массиве нет числового индекса.
Использование array_values () создаст нулевой индексированный массив, который затем можно будет искать с помощью array_search (), минуя необходимость использования цикла for.
$list = array('string1', 'string2', 'string3'); $index = array_search('string2',array_values($list));
источник
Не могли бы вы быть более конкретными?
$key = array_search('string2',$list)
у меня отлично работает. Вы пытаетесь выполнить что-то более сложное?
источник
Этот код должен делать то же самое, что и ваша новая процедура, работая с правильным многомерным массивом.
$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));
источник
Вам нужно будет создать для этого функцию. Я не думаю, что для этого есть встроенная функция. По умолчанию все массивы PHP ассоциативны. Итак, если вы не уверены в их ключах, вот код:
<?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
источник
Попробуйте функцию PHP array_keys.
$key_string1 = array_keys($list, 'string1');
источник
array_keys
отличается отarray_search
array_search должен работать нормально, просто протестировал это, и он возвращает ключи, как ожидалось:
$list = array('string1', 'string2', 'string3'); echo "Key = ".array_search('string1', $list); echo " Key = ".array_search('string2', $list); echo " Key = ".array_search('string3', $list);
Или для индекса вы можете использовать
$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;
источник
Вот функция, которая будет работать с числовыми или строковыми индексами. Передайте массив в качестве первого параметра, затем индекс элемента, который необходимо переместить, и, наконец, установите направление на -1, чтобы переместить элемент вверх, и на 1, чтобы переместить его вниз. Пример: Move (['first' => 'Peter', 'second' => 'Paul', 'third' => 'Kate'], 'second', - 1) переместит Пола вверх, а Питера вниз.
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;
}
источник