【问题标题】:How to get array key by value?如何按值获取数组键?
【发布时间】:2016-12-15 13:03:06
【问题描述】:

我有数组问题。这是我的数组:

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

【问题讨论】:

    标签: php arrays key reverse-lookup


    【解决方案1】:

    这是因为在下面的数组初始化中:

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

    您将字符串键分配给除HTPHT 之外的所有值。 PHP默认为这些项目分配了键,分别是01等。

    您似乎想为 PHP 中的多个元素分配相同的键。但是,这是不可能的。


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

    即这样的数组:

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

    【讨论】:

    • 这行得通吗:$servicesTypes = array ("hotel" => array ("HTL", "HTP", "HT"), "flight" => array ("FLT"), " m&a" => array ("APA"), "daily_tour" => array ("TOU"), "privat_car" => array ("PRC"), "transfer" => array ("4ST") );跨度>
    • @Roi 我将在我的回答中解决这个问题。它会起作用,但你的搜索功能会更复杂。
    • @LambdaNinja - 谢谢
    【解决方案2】:

    您对阵列的形状有误。

      "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
    • 这行得通吗:$servicesTypes = array ("hotel" => array ("HTL", "HTP", "HT"), "flight" => array ("FLT"), " m&a" => array ("APA"), "daily_tour" => array ("TOU"), "privat_car" => array ("PRC"), "transfer" => array ("4ST") );跨度>
    • @Roi 不会使事情复杂化,我会更改数组的形状以使其更简单。看看我的扩展答案。
    【解决方案3】:

    您的数组格式有点错误,代码也随之更改(= [ ] 相当于= 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');
    

    【讨论】:

    • array() 语法没有任何问题。其实可能是be preferred because it has older support.
    • 这也根本没有回答问题。
    • 答案不应该集中在数组语法上,我在答案中使用了方括号,因为这是我更喜欢的方式。我改变的是数组的格式,据我了解,这是为使用不当而做的。然后该函数循环遍历每个类别中的每个标签并返回找到$type 的类别,否则返回returns false
    【解决方案4】:
    $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;
            }
        }
    }
    

    返回假; }

    【讨论】:

    • 欢迎来到 Stack Overflow!虽然这段代码 sn-p 可以解决问题,但including an explanation 确实有助于提高帖子的质量。请记住,您正在为将来的读者回答问题,而这些人可能不知道您的代码建议的原因。也请尽量不要用解释性的 cmets 挤满你的代码,这会降低代码和解释的可读性!
    猜你喜欢
    • 2013-01-31
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多