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

У меня этот массив в PHP:

array( [0] => array( 'username' => 'user1' ) [1] => array( 'username' => 'user2' ) ) 

Если у меня есть строка «имя пользователя», как я могу получить значение индекса в виде числа?

Например, если у меня есть «user1», как я могу получить 0?

Если у вас есть 2D-массив, как в вашем примере, вам нужно немного изменить настройки:

 function array_search2d($needle, $haystack) { for ($i = 0, $l = count($haystack); $i < $l; ++$i) { if (in_array($needle, $haystack[$i])) return $i; } return false; } $myArray = array( array( 'username' => 'user1' ), array( 'username' => 'user2' ) ); $searchTerm = "user1"; if (false !== ($pos = array_search2d($searchTerm, $myArray))) { echo $searchTerm . " found at index " . $pos; } else { echo "Could not find " . $searchTerm; } 

Если вы хотите выполнить поиск только в одном конкретном поле, вы можете изменить функцию на что-то вроде этого:

 function array_search2d_by_field($needle, $haystack, $field) { foreach ($haystack as $index => $innerArray) { if (isset($innerArray[$field]) && $innerArray[$field] === $needle) { return $index; } } return false; } 

Посмотрите на array_search .

Из файла справки PHP:

 <?php $array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red'); $key = array_search('green', $array); // $key = 2; $key = array_search('red', $array); // $key = 1; ?> 

Это было бы очень просто

 private function getArrayKey($haystack, $needle) { foreach($haystack as $key => $product) { if ($product['id'] === $needle) return $key; } return false; } 

Возможно, использование array_filter и array_keys вместе поможет.

Классный подход.

 <?php class ArraySearch2d { static protected $_key; static protected $_value; static function isMatch($element) { if (!is_array($element)) return false; return $element[self::$_key] == self::$_value; } static function filter(array $arrayToSearch, $key, $value) { if (!is_string($key)) throw new Exception("Array Key must be a string"); self::$_key = $key; self::$_value = $value; return array_filter($arrayToSearch, 'ArraySearch2d::isMatch'); } // to directly answer your question. static function getIndex(array $arrayToSearch, $key, $value) { $matches = self::filter($arrayToSearch, $key, $value); if (!count($matches)) return false; $indexes = array_keys($matches); return $indexes[0]; } } $array = array("1"=>array('username'=>'user1'), "3"=>array('username'=>'user2')); $matches = ArraySearch2d::filter($array, 'username', 'user2'); var_dump($matches); $indexs = array_keys($matches); var_dump($indexs); // Demonstrating quick answer: echo "Key for first 'username'=>'user1' element is: " .ArraySearch2d::getIndex($array, 'username', 'user1')."\n"; 

Производит:

 array(1) { [3]=> array(1) { ["username"]=> string(5) "user2" } } array(1) { [0]=> int(3) } Key for first 'username'=>'user1' element is: 1 

Без использования классов – это дает тот же результат:

 <?php $field="username"; $value = "user2"; function usernameMatch($element) { global $field, $value; if (!is_array($element)) return false; return $element[$field] == $value; } function getFirstIndex(array $array) { if (!count($array)) return false; $indexes = array_keys($array); return $indexes[0]; } $array = array("1"=>array('username'=>'user1'), "3"=>array('username'=>'user2')); $matches = array_filter($array, 'usernameMatch'); var_dump($matches); $indexs = array_keys($matches); var_dump($indexs); // Demonstrating quick answer - and why you should probably use the class- // you don't want to have to remember these "globals" all the time. $field = 'username'; $value = 'user1'; echo "Key for first 'username'=>'user1' element is: " .getFirstIndex(array_filter($array, 'usernameMatch')); 

Если вы знаете, что ключ является username , просто используйте массив в качестве параметра поиска:

 $username = 'user1'; $key = array_search(array('username' => $username), $array);