按字符串或模式搜索数组键


Searching array keys by a string or pattern

我有一些PHP,我相信它可以做得更优雅一点。它在功能上是有效的,所以它更多的只是为了自我学习。

我有一个带有不同字母键的数组(或对象),我想知道是否设置了键,如果设置了,返回剩余的匹配项。

我目前拥有的PHP代码只是一个基本的if语句:

if(isset($item->revision->application_uid)) $item->type = 'application';
elseif(isset($item->revision->channel_uid)) $item->type = 'channel';
elseif(isset($item->revision->workout_uid)) $item->type = 'workout';

因此,本质上,我想要搜索所有的键,并返回"_uid"键的剩余部分。

[编辑]除此之外,我还提出了另一个建议,但我仍然想知道是否有更好/更有效的方法来做到这一点。

foreach(array_keys((array) $item->revision) as $key)
{
    if($match = strstr($key, '_uid', TRUE))
    {
        $item->type = $match;
        break;
    }
}

提前谢谢。

您的代码有点重复,foreach已经提供了密钥,所以您不需要调用array_keys:

foreach ($item->revision as $key => $value)
{
    if ($match = strstr($key, '_uid', TRUE))
    {
        $item->type = $match;
        break;
    }
}

所以这看起来并没有那么糟糕。如果找不到类型,您可能希望使用NULL值或某些默认值进行初始化:

$item->type = 'none';
foreach ($item->revision as $key => $value)
{
    if ($match = strstr($key, '_uid', TRUE))
    {
        $item->type = $match;
        break;
    }
}

然后将其封装为自己的函数:

function findUidKey($item) {
    foreach ($item->revision as $key => $value)
    {
        if ($match = strstr($key, '_uid', TRUE))
        {
            return $match;
        }
    }
    return 'none';        
}

并调用该函数:

$item->type = findUidKey($item);

此外,您甚至可以将其封装在另一个类中,但也许可以将其留到另一个时间,只需开始使用函数即可。