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

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

$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;
}

4 ответа

Решение

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

$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.

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

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

Вы немного неправильно отформатировали массив, и код изменяется с этим (= [ ] является эквивалентом = 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');
$servicesTypes = array (
"hotel"         => array("HTL", "HTP", "HT"),
"flight"        => "FLT",
"m&a"           => "APA",
"daily_tour"    => "TOU",
"privat_car"    => "PRC",
"transfer"      => "4ST"
); 

function 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;
        }
    }
}

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

Другие вопросы по тегам