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

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

$servicesTypes = array (
"hotel"         => "HTL", "HTP", "HT",
"flight"        => "FLT",
"m&a"           => "APA",
"daily_tour"    => "TOU",
"privat_car"    => "PRC",
"transfer"      => "4ST");

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

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

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

Это почему?

Это мой код:

function get_service_type ($servicesArray, $type)
{
$key = array_search($type, $servicesArray);
echo "key: ".$key;
return $key;
}

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

function get_service_type ($servicesArray, $type)
{

foreach($servicesArray as $key => $service)
{

if ( $service == $type )
{
echo "key: ".$key;
return $key;
}
}
return false;
}

1

Решение

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

$servicesTypes = array (
"hotel"         => "HTL", "HTP", "HT",
"flight"        => "FLT",
"m&a"           => "APA",
"daily_tour"    => "TOU",
"privat_car"    => "PRC",
"transfer"      => "4ST");

Вы присваиваете строковые ключи всем значениям, кроме HTP а также HT, Этим пунктам по умолчанию назначаются ключи, которые 0, 1, и так далее.

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


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

Т.е. массив такой:

$servicesTypes = array (
"hotel"         => array("HTL", "HTP", "HT"),
"flight"        => "FLT",
"m&a"           => "APA",
"daily_tour"    => "TOU",
"privat_car"    => "PRC",
"transfer"      => "4ST");

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

function get_service_type ($servicesArray, $type) {
foreach($servicesArray as $key => $service)
if ( is_array($service) ) {
foreach($service as $value)
if($type == $value)
return $key;
} else if ( $service == $type )
return $key;
return false;
}

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

  1. Проходит через $servicesArray
  2. Если $service это массив:
    • Перебрать $service,
    • Если совпадение найдено, верните ключ.
  3. Иначе если $service это строка:
    • Если совпадение найдено, верните ключ.
  4. Если совпадений нет, верните false.
1

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

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

  "hotel"   => "HTL", "HTP", "HT",

Вы думаете, что это один элемент массива, но на самом деле это 3 элемента (элементы массива разделяются запятыми). Если вы не предоставляете ключ для элемента массива, PHP выбирает ключ для вас, начиная с индекса 0, затем 1

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

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

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

[
'HTL' => 'hotel',
'HTP' => 'hotel',
'HT' => 'hotel',
'FLT' => 'flight',
'APA' => 'm&a',
...
]

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

function get_service_type ($servicesTypes, $type){
return $servicesTypes[$type];
}

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

$categories = array_unique($servicesTypes);
1

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

$servicesTypes = [
'hotel' => [
'HTL',
'HTP',
'HT'
],
'flight' => [
'FLT'
],
'm&a' => [
'APA'
],
'daily_tour' => [
'TOU'
],
'private_car' => [
'PRC'
],
'transfer' => [
'4ST'
],
];

function get_service_type ($servicesArray, $type)
{

foreach($servicesArray as $key => $services)
{
foreach ($services as $service)
{
if ($service == $type)
{
return $key;
}
}
}
return false;
}

echo get_service_type($servicesTypes, 'HT');
0

$servicesTypes = array (
"hotel"         => array("HTL", "HTP", "HT"),
"flight"        => "FLT",
"m&a"           => "APA",
"daily_tour"    => "TOU",
"privat_car"    => "PRC",
"transfer"      => "4ST");

функция get_service_type ($ servicesArray, $ type)
{

foreach($servicesArray as $key => $service)
{
if(is_array($service))
{
if(in_array($type,$service))
return $key;
}else
{
if ( $service == $type )
{
echo "key: ".$key;
return $key;
}
}
}

вернуть ложь;
}

0
По вопросам рекламы [email protected]