php вернуть ключ по значению

array_search

(PHP 4 >= 4.0.5, PHP 5, PHP 7, PHP 8)

array_search — Осуществляет поиск данного значения в массиве и возвращает ключ первого найденного элемента в случае успешного выполнения

Описание

Список параметров

Если needle является строкой, сравнение происходит с учётом регистра.

Возвращаемые значения

Примеры

Пример #1 Пример использования array_search()

Смотрите также

User Contributed Notes 44 notes

in (PHP 5 >= 5.5.0) you don’t have to write your own function to search through a multi dimensional array

$userdb=Array
(
(0) => Array
(
(uid) => ‘100’,
(name) => ‘Sandra Shush’,
(url) => ‘urlof100’
),

(1) => Array
(
(uid) => ‘5465’,
(name) => ‘Stefanie Mcmohn’,
(pic_square) => ‘urlof100’
),

(2) => Array
(
(uid) => ‘40489’,
(name) => ‘Michael’,
(pic_square) => ‘urlof40489’
)
);

simply u can use this

$key = array_search(40489, array_column($userdb, ‘uid’));

About searcing in multi-dimentional arrays; two notes on «xfoxawy at gmail dot com»;

It perfectly searches through multi-dimentional arrays combined with array_column() (min php 5.5.0) but it may not return the values you’d expect.

Secondly, if your array is big, I would recommend you to first assign a new variable so that it wouldn’t call array_column() for each element it searches. For a better performance, you could do;

It’s what the document stated «may also return a non-Boolean value which evaluates to FALSE.»

the recursive function by tony have a small bug. it failes when a key is 0

here is the corrected version of this helpful function:

If you are using the result of array_search in a condition statement, make sure you use the === operator instead of == to test whether or not it found a match. Otherwise, searching through an array with numeric indicies will result in index 0 always getting evaluated as false/null. This nuance cost me a lot of time and sanity, so I hope this helps someone. In case you don’t know what I’m talking about, here’s an example:

hallo every body This function matches two arrays like
search an array like another or not array_match which can match

for searching case insensitive better this:

About searcing in multi-dimentional arrays;
note on «xfoxawy at gmail dot com» and turabgarip at gmail dot com;

$xx = array_column($array, ‘NAME’, ‘ID’);
will produce an array like :
$xx = [
[ID_val] => NAME_val
[ID_val] => NAME_val
]

$yy = array_search(‘tesxt’, array_column($array, ‘NAME’, ‘ID’));
will output expected ID;

To expand on previous comments, here are some examples of
where using array_search within an IF statement can go
wrong when you want to use the array key thats returned.

Take the following two arrays you wish to search:

I was going to complain bitterly about array_search() using zero-based indexes, but then I realized I should be using in_array() instead.

The essence is this: if you really want to know the location of an element in an array, then use array_search, else if you only want to know whether that element exists, then use in_array()

Be careful when search for indexes from array_keys() if you have a mixed associative array it will return both strings and integers resulting in comparison errors

/* The above prints this, as you can see we have mixed keys
array(3) <
[0]=>
int(0)
[1]=>
string(3) «car»
[2]=>
int(1)
>
*/

hey i have a easy multidimensional array search function

Despite PHP’s amazing assortment of array functions and juggling maneuvers, I found myself needing a way to get the FULL array key mapping to a specific value. This function does that, and returns an array of the appropriate keys to get to said (first) value occurrence.

But again, with the above solution, PHP again falls short on how to dynamically access a specific element’s value within the nested array. For that, I wrote a 2nd function to pull the value that was mapped above.

I needed a way to return the value of a single specific key, thus:

Better solution of multidimensional searching.

FYI, remember that strict mode is something that might save you hours.

one thing to be very aware of is that array_search() will fail if the needle is a string and the array itself contains values that are mixture of numbers and strings. (or even a string that looks like a number)

The problem is that unless you specify «strict» the match is done using == and in that case any string will match a numeric value of zero which is not what you want.

also, php can lookup an index pretty darn fast. for many scenarios, it is practical to maintain multiple arrays, one in which the index of the array is the search key and the normal array that contains the data.

//very fast lookup, this beats any other kind of search

I had an array of arrays and needed to find the key of an element by comparing actual reference.
Beware that even with strict equality (===) php will equate arrays via their elements recursively, not by a simple internal pointer check as with class objects. The === can be slow for massive arrays and also crash if they contain circular references.

This function performs reference sniffing in order to return the key for an element that is exactly a reference of needle.

A simple recursive array_search function :

A variation of previous searches that returns an array of keys that match the given value:

I needed a function, that returns a value by specifying a keymap to the searched value in a multidimensional array and came up with this.

My function get_key_in_array() needed some improvement:

An implementation of a search function that uses a callback, to allow searching for objects of arbitrary complexity:

For instance, if you have an array of objects with an id property, you could search for the object with a specific id like this:

For a more complex example, this function takes an array of key/value pairs and returns the key for the first item in the array that has all those properties with the same values.

The final step is a function that returns the item, rather than its key, or null if no match found:

Источник

array_keys

(PHP 4, PHP 5, PHP 7, PHP 8)

array_keys — Возвращает все или некоторое подмножество ключей массива

Описание

Список параметров

Массив, содержащий возвращаемые ключи.

Если указано, будут возвращены только ключи у которых значения элементов массива совпадают с этим параметром.

Определяет использование строгой проверки на равенство (===) при поиске.

Возвращаемые значения

Примеры

Пример #1 Пример использования array_keys()

Результат выполнения данного примера:

Смотрите также

User Contributed Notes 28 notes

It’s worth noting that if you have keys that are long integer, such as ‘329462291595’, they will be considered as such on a 64bits system, but will be of type string on a 32 bits system.

?>

will return on a 64 bits system:

but on a 32 bits system:

I hope it will save someone the huge headache I had 🙂

Here’s how to get the first key, the last key, the first value or the last value of a (hash) array without explicitly copying nor altering the original array:

Since 5.4 STRICT standards dictate that you cannot wrap array_keys in a function like array_shift that attempts to reference the array.

Invalid:
echo array_shift( array_keys( array(‘a’ => ‘apple’) ) );

But Wait! Since PHP (currently) allows you to break a reference by wrapping a variable in parentheses, you can currently use:

echo array_shift( ( array_keys( array(‘a’ => ‘apple’) ) ) );

However I would expect in time the PHP team will modify the rules of parentheses.

There’s a lot of multidimensional array_keys function out there, but each of them only merges all the keys in one flat array.

Here’s a way to find all the keys from a multidimensional array while keeping the array structure. An optional MAXIMUM DEPTH parameter can be set for testing purpose in case of very large arrays.

NOTE: If the sub element isn’t an array, it will be ignore.

output:
array(
‘Player’ => array(),
‘LevelSimulation’ => array(
‘Level’ => array(
‘City’ => array()
)
),
‘User’ => array()
)

array (size=4)
0 => string ‘e’ (length=1)
1 => int 1
2 => int 2
3 => int 0

—-
expected to see:
dude dude dude

Sorry for my english.

I wrote a function to get keys of arrays recursivelly.

Here’s a function I needed to collapse an array, in my case from a database query. It takes an array that contains key-value pairs and returns an array where they are actually the key and value.

?>

Example usage (pseudo-database code):

= db_query ( ‘SELECT name, value FROM properties’ );

/* This will return an array like so:

/* Now this array looks like:

?>

I found this handy for using with json_encode and am using it for my project http://squidby.com

This function will print all the keys of a multidimensional array in html tables.
It will help to debug when you don?t have control of depths.

An alternative to RQuadling at GMail dot com’s array_remove() function:

The position of an element.

One can apply array_keys twice to get the position of an element from its key. (This is the reverse of the function by cristianDOTzuddas.) E.g., the following may output «yes, we have bananas at position 0».

Hope this helps someone.

# array_keys() also return the key if it’s boolean but the boolean will return as 1 or 0. It will return empty if get NULL value as key. Consider the following array:

Array
(
[ 0 ] => first_index
[ 1 ] => 1
[ 2 ] => 0
[ 3 ] => 4
[ 4 ] => 08
[ 5 ] => 8
[ 6 ] =>
)

This function will extract keys from a multidimensional array

Array
(
[color] => Array
(
[1stcolor] => blue
[2ndcolor] => red
[3rdcolor] => green
)

[size] => Array
(
[0] => small
[1] => medium
[2] => large
)

Array
(
[0] => color
[1] => 1stcolor
[2] => 2ndcolor
[3] => 3rdcolor
[4] => size
[5] => 0
[6] => 1
[7] => 2
)

All the cool notes are gone from the site.

Here’s an example of how to get all the variables passed to your program using the method on this page. This prints them out so you can see what you are doing.

Simple ways to prefixing arrays;

[1] => Array
(
[product_id] => 2
[product_name] => Bar
)

I was looking for a function that deletes either integer keys or string keys (needed for my caching).
As I didn’t find a function I came up with my own solution.
I didn’t find the propiest function to post to so I will post it here, hope you find it useful.

?>

You can of course define constants to have a nicer look, I have chosen these: EXTR_INT = 1; EXTR_STRING = 2
EXTR_INT will return an array where keys are only integer while
EXTR_STRING will return an array where keys are only string

A needed a function to find the keys which contain part of a string, not equalling a string.

Источник

Php вернуть ключ по значению

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

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

Случай первый.

в результате исполнения кода получим на первый взгляд странный ответ – «город не найден». То есть элемент совпадающий с «Москва» в массиве есть, но он почему-то не «ищется» ….

Случай второй.

Аналогичная ситуация. Элемент в массиве совершенно очевидно присутствует, но в качестве результата мы получаем ответ, что «элемент не найден».

Случай третий.

Аналогично – получаем ответ «элемент не найден».

Случай четвертый.

Тоже самое, при исполнении кода получим на мониторе «элемент не найден».

Случай пятый.

«И опять, двадцать пять»…. Как говорится.

Причина возникающей ошибки и ее решение.

На самом деле причина возникающих ошибок кроется не в самой функции array_search(), а в том какой результат она возвращает и как мы его проверяем. Дело в том, что в php, как и в большинстве других языков программирования, при обработке информации, важное значение имеет не только конкретное значение переменной, но и тип данных, к которым она относится.

В частности в данном случае, функция возвращает либо «false» (тип данных boolean), либо ключ элемента в массиве. Этот ключ может представлять собой или целое число (integer), или строку (string), или вещественное число с десятичной добью (float), или специфический тип данных, обозначающий неопределенное значение (NULL). И ошибка в выше приведенных примерах связана с тем, что некоторые значения не boolean данных могут быть преобразованы в boolean. В частности, согласно самой справки php, следующие значение могут быть преобразованы в булев «false»:

Разберем каждый из перечисленных выше примеров.

Случай первый.

По умолчанию, нумерация ключей элементов массива начинается с 0, если не задано иначе специально. Соответственно, функция array_search() вернула правильный результат – номер ключа 0 (integer, целое число), но при сравнении этот результат был приведен к булеву «false», а это в свою очередь выполнило условие, что «элемент не найден».

Случай второй.

Заданы ключи элементов массива, которые являются строками, но при этом ключ искомого элемента равен пустой строке «». И при проверке условия, эта пустая строка была интерпретирована как булев «false», что опять же выполнило условие для вывода «элемент не найден».

Случай третий.

Ключи массива заданы строками, при этом ключ искомого элемента равен строке «0». Именно строке, не целому числу, а строке. Именно этот ключ функция вернула, но при проверке это значение было приведено к boolean «false».

Случай четвертый.

Ключи элементов массива заданы в виде чисел с плавающей точкой (float). Ключ целевого элемента массива оказался равен нулю (0.0), который при сравнении был рассмотрен как «false», что выполнило условие для вывода результата о том, что элемент в массиве не найден.

Случай пятый.

Решение.

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

то есть в таком случае мы не только проверяем значение ответа функции, но и убеждаемся (в данном случае), что оно он относится к типу данных boolean.

Функция is_bool() проверяет – относится ли переданное ей значение к типу boolean.

Но, конечно же, обычно так условие никто не записывает. Так как есть специальный оператор «тождественно равно» (===) и ему противоположный «тождественно не равно» (!==). Это операторы строгой проверки, когда проверяется не только конкретное значение присланной переменной, но и тип ее данных. Поэтому для исправления ошибки во всех приведенных примерах, в блоке условия проверку следует переписать так:

тогда мы начнем получать правильные ответы от работы кода.

Обобщение.

Вообще говоря, строгая проверка, о которой говорится в этой статье, полезна и для многих других функций php, которые могут возвращать либо ошибку «false», либо какое-то вычисленное, найденное, извлеченное значение… Потому, что иногда вычисленное, найденное, извлеченное значение может совпадать со значением «false», хотя и относиться к другому типу данных (то есть любой тип данных кроме boolean).

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

Источник

array_key_exists

(PHP 4 >= 4.0.7, PHP 5, PHP 7, PHP 8)

array_key_exists — Проверяет, присутствует ли в массиве указанный ключ или индекс

Описание

Список параметров

Массив с проверяемыми ключами.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

array_key_exists() ищет ключи только на первом уровне массива. Внутренние ключи в многомерных массивах найдены не будут.

Примеры

Пример #1 Пример использования array_key_exists()

Пример #2 array_key_exists() и isset()

Примечания

Смотрите также

User Contributed Notes 39 notes

If you want to take the performance advantage of isset() while keeping the NULL element correctly detected, use this:

Benchmark (100000 runs):
array_key_exists() : 205 ms
is_set() : 35ms
isset() || array_key_exists() : 48ms

Note:
The code for this check is very fast, so you shouldn’t warp the code into a single function like below, because the overhead of calling a function dominates the overall performance.

function array_check(. )
<
return (isset(..) || array_key_exists(. ))
>

You’ll notice several notes on this page stating that isset() is significantly faster than array_key_exists(). This may be true except for one small hitch. isset() will return false for arrays keys that have there value set to NULL, which is therefore not entirely accurate.

= array();
$foo [ ‘bar’ ] = NULL ;

Beware that if the array passed to array_key_exists is NULL, the return value will also be NULL.

This is undocumented behaviour, moreover the documentation (and return typehint) suggest that the array_key_exists function only returns boolean value. But that’s not the case.

Rudi’s multidimensional array_key_exists function was not working for me, so i built one that is.
Enjoy.

The way array_key_exists handles null, float, boolean, and ‘integer-representing string’ keys is inconsistent in itself and, in the case of bool and float, with the way these are converted when used as array offset.

array (
» => 1,
0 => 2,
1 => 3,
4 => 4,
’08’ => 5,
8 => 6,
)
null is a key.
false is not a key.
true is not a key.
4.6 is not a key.
«08» is a key.
«8» is a key.

Well, and you get this warning three times (on the bools and the float, but not on the null):

Warning: array_key_exists() [function.array-key-exists]: The first argument should be either a string or an integer in /var/www/php/test.php on line 6

I’ve got a new take on the multi key function I would like to share.

Very simple case-insensitive array_key_exists:

bool (in_array(strtolower($needle), array_map(‘strtolower’, array_keys($haystack))))

array_key_exists doesn’t work with objects implementing ArrayAccess interface. It also ignores possible __get() method in such objects, despite the fact it accepts object as a second parameter. It works only with ‘real’ properties.

Here is an example with array_key_exists switching between content-types :

The argument of array_key_exists() vs. isset() came up in the workplace today, so I conducted a little benchmark to see which is faster:

?>

On Windows, the output is similar to

array_key_exists(): 0.504 [82.895%] seconds
isset(): 0.104 [17.105%] seconds

On Mac or Linux, isset() is faster but only by a factor of approximately 1.5.

Источник

Как получить ключ массива по значению?

У меня есть проблема с массивом. Это мой массив:

для каждого «типа», который я отправляю, я пытаюсь получить ключ («гостиница», «рейс» и т. д.)

большую часть времени я получаю это, но для некоторых значений я получаю: «ключ: 0»

На мгновение, если type = «HTP», этот ключ будет равен 0, для ключа «HT» будет «1».

Я также попробовал это:

Решение

Это потому, что в следующей инициализации массива:

Кажется, вы хотите назначить один и тот же ключ нескольким элементам в PHP. Это не возможно, однако.

РЕДАКТИРОВАТЬ ОП спросил в комментариях ниже, возможно ли присвоить массив значений каждому ключу. Это возможно, но это усложнит функцию поиска.

в котором значения могут быть строками или массивы, можно найти с помощью get_service_function() вот так (немного почистил):

Что делает вышеуказанная функция:

Другие решения

Вы ошибаетесь по поводу формы вашего массива.

Так что ваши get_service_type() функция работает как положено.

В ответ на ваш комментарий ниже:

Потому что вы знаете тип (например: HTP ) и вам нужно найти категорию (например: Hotel ), самый простой способ — изменить способ построения массива. Используйте ключи магазина информацию, которую вы знаете. Например:

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

Если вам также нужен доступ только к категориям (отель, рейс, м&а …) и вы сформировали массив, как я рекомендую выше, это легко 🙂

Вы немного неправильно отформатировали массив, и код изменяется с этим ( = [ ] является эквивалентом = array( ) ):

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *