Отримайте значення індексу масиву в PHP


86

У мене є масив:

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

Я хочу отримати індекс для заданого значення (тобто 1для string2і 2для string3)

Все, що я хочу, - це розташування рядків у масиві

  • рядок1 дорівнює 0
  • рядок2 дорівнює 1
  • рядок3 дорівнює 2

Як цього досягти?


7
Мій друг письменник із технологій сказав мені: "ти не можеш отримати правильних відповідей, якщо не задаси правильних питань".
Білл Карвін,

це старе .... але мені хотілося б знати, чому: "Я спробував array_search, але користі не було"
dsdsdsdsd

Будь ласка, позначте відповідь із вищим рейтингом як прийняту.
Робш

Якщо у вас є асоціативний масив, як і у мене, ця відповідь допоможе: stackoverflow.com/a/3365793/470749
Райан,

Відповіді:


157

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;

Ви можете прокрутити масив вручну і знайти індекс, але навіщо це робити, коли для цього є функція. Ця функція завжди повертає ключ, і вона буде добре працювати з асоціативними та нормальними масивами.


10
Це повертає ключ, а не індекс. У вашому прикладі ключем зручно є індекс значення.
Хорхе Феррейра

1
@smink, масив OP - це неасоціативний масив, тому він працює нормально.
Метью Флашен

вибачте, я не вказав тип масиву. Масив, який я використовую, є багатовимірним масивом, будь ласка, перегляньте мою відповідь на рішення
Aakash Chakravarthy

У мене такий тип масиву: [0 => {id: 1, name: something}, 1 => {.....}, ...]. чи можливо це знайти ключ / індекс, такий як array_search ("name" => щось, $ 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, "

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));

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

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));

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, щоб перемістити його вниз. Приклад: Переміщення (['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;

}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.