Получить значение индекса массива в PHP

87

У меня есть массив:

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

Я хочу получить индекс для данного значения (т.е. 1дляstring2 и 2для string3)

Все, что мне нужно, это положение строк в массиве

  • строка1 равна 0
  • строка2 равна 1
  • string3 равно 2

Как этого добиться?

Аакаш Чакраварти
источник
7
Один мой друг-технический писатель сказал мне: «Вы не сможете получить правильные ответы, если не зададите правильные вопросы».
Билл Карвин,
это старый .... но я хотел бы знать, почему: «Я пробовал array_search, но это было бесполезно»
dsdsdsdsd
Пожалуйста, отметьте ответ с более высокой оценкой как принятый.
Робс
Если у вас есть ассоциативный массив, как у меня, этот ответ поможет: stackoverflow.com/a/3365793/470749
Райан

Ответы:

158

array_search способ сделать это.

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

Из документов :

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

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

Вы можете перебрать массив вручную и найти индекс, но зачем это делать, если для этого есть функция. Эта функция всегда возвращает ключ и хорошо работает с ассоциативными и обычными массивами.

RaYell
источник
10
Это возвращает ключ, а не индекс. В вашем примере ключом является индекс значения.
Хорхе Феррейра
1
@smink, массив OP - неассоциативный массив, поэтому он отлично работает.
Мэтью Флашен
извините, я не указал тип массива. Массив, который я использую, представляет собой многомерный массив, пожалуйста, посмотрите мой ответ на решение
Аакаш Чакраварти,
У меня есть такой тип массива: [0 => {id: 1, name: something}, 1 => {.....}, ...]. возможно ли найти ключ / индекс, например array_search ("name" => something, $ array)?
lazzy_ms
Как насчет того, есть ли у массива дочерний элемент?
zukijuki
19

Если вы выполняете только несколько из них (и / или размер массива большой), значит, вы были на правильном пути с 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, "
ircmaxell
источник
1
foreach - это то, что мне нужно
zzapper
11

Другие люди предложили, 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_values ​​() был бесполезен» .. должен быть «array_search () был бесполезен»
Vex
7

// или учитывая структуру вашего массива:

$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
Майкл Херли
источник
6

Проблема в том, что в вашем массиве нет числового индекса.
Использование array_values ​​() создаст нулевой индексированный массив, который затем можно будет искать с помощью array_search (), минуя необходимость использования цикла for.

$list = array('string1', 'string2', 'string3');
$index = array_search('string2',array_values($list));
Брайан Бернекер
источник
это пока самый короткий и
действенный
1

Не могли бы вы быть более конкретными?

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

у меня отлично работает. Вы пытаетесь выполнить что-то более сложное?

Джефф
источник
1

Этот код должен делать то же самое, что и ваша новая процедура, работая с правильным многомерным массивом.

 $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));
Vex
источник
1
В вопросе ничего не упоминается о многомерных массивах (комментарии OP в других ответах предполагают, что этот ответ - это то, что он действительно искал, но если вы читаете только исходный вопрос и этот ответ, то, что вы говорите, не имеет смысла)
StubbornShowaGuy
1

Вам нужно будет создать для этого функцию. Я не думаю, что для этого есть встроенная функция. По умолчанию все массивы 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

Криш П.Г.
источник
0

Попробуйте функцию PHP array_keys.

$key_string1 = array_keys($list, 'string1');
Evernoob
источник
разве эти параметры не меняются местами ?
ashleedawg
@ashleedawg Нет, вы неправильно прочитали, array_keysотличается отarray_search
A Friend
0

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));
Vex
источник
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

Вот функция, которая будет работать с числовыми или строковыми индексами. Передайте массив в качестве первого параметра, затем индекс элемента, который необходимо переместить, и, наконец, установите направление на -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;

}

JG Estiot
источник