如何按值获取数组键?

时间:2016-08-09 13:00:04

标签: php arrays key reverse-lookup

我有阵列问题。这是我的阵列:

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

对于每个“类型”我发送我试图去钥匙(“酒店”,“航班”等)

大部分时间我都会得到它,但对于某些值我得到:“key: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 个答案:

答案 0 :(得分: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];
}

如果您还需要访问类别(酒店,航班,m& a ......),并按照我的建议对形状进行整形,那么很简单: - )

$categories = array_unique($servicesTypes);

答案 1 :(得分:1)

这是因为以下数组初始化:

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

您可以为除HTPHT之外的所有值指定字符串键。默认情况下,这些项由PHP分配,分别为01,等等。

您似乎希望将相同的密钥分配给PHP中的多个元素。但是,这是不可能的。

编辑 OP在下面的评论中询问是否可以为每个键分配一组值。这是可能的,但它会使搜索功能更复杂。

即,像这样的数组:

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

答案 2 :(得分:0)

您已经错误地格式化了数组并且代码随之更改(= [ ]相当于= 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');

答案 3 :(得分:0)

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

返回false; }