在一个对象数组中使用PHP的array_search函数

7

http://php.net/manual/zh/function.array-search.php 允许我根据数组值查找第一个数组键。

如果该值嵌套在数组值中的对象中,是否可以使用单个PHP函数来完成此操作,或者必须像下面所示手动执行?

谢谢

<?php
function getKeyBasedOnName($arr,$name)
{
    foreach($arr as $key=>$o) {
        if($o->name==$name) return $key;
    }
    return false;
}
$json='[
{
"name": "zero",
"data": [107, 31, 635, 203, 2]
},
{
"name": "one",
"data": [133, 156, 947, 408, 6]
},
{"name": "two",
"data": [1052, 954, 4250, 740, 38]
}
]';
$arr=json_decode($json);
var_dump(getKeyBasedOnName($arr,'zero')); //Return 0  
var_dump(getKeyBasedOnName($arr,'one')); //Return 1  
var_dump(getKeyBasedOnName($arr,'two')); //Return 2
var_dump(getKeyBasedOnName($arr,'three')); //Return false

我相信你的函数是需要完成的。请注意,如果name未设置,那么会抛出一个通知。也许可以修改你的if语句为if ( property_exists($o, 'name') && $o->name == $name) {... - random_user_name
也许可以这样使用 array_filter?因为要使用“外部值”,所以必须将其放入类中并包装在函数中,所以最终代码可能与您的代码一样冗长。另外,最近我在使用Javascript / Angular时发现了lodash库,发现它非常有用,我经常感叹没有更好的工具。考虑使用此库,该库将许多超级有用的函数移植到php中。 - random_user_name
@cale_b. 是的,也许是。顺便问一下,你看过http://php.net/manual/en/book.spl.php吗?也许那是你要找的东西。 - user1032531
@ldg - 注意,OP实际上是从循环中返回,这可能比使用break更有效。 - random_user_name
@JonathanKuhn 我刚测试了一下,也发现了null - user1032531
显示剩余6条评论
3个回答

12

仅仅是为了好玩,如果数组是基于0的连续键:

echo array_search('zero', array_column(json_decode($json, true), 'name'));
  • 将所有name键的值提取到一个数组中
  • 搜索名称值以返回键

这将将JSON解码为数组。如果需要,您可以在之后将其解码为对象。从PHP 7开始,您可以使用对象数组:

echo array_search('zero', array_column(json_decode($json), 'name'));

我想这基本上回答了问题,但可能会继续使用我的简单函数。谢谢。 - user1032531
没问题。添加了 PHP 7 的示例。 - AbraCadaver
我喜欢 PHP 7 的解决方案,并将在使用 PHP 7 时尝试记住它。 - user1032531

6

没有单一内置函数可以提供任意比较。但是,您可以自己编写通用的数组搜索函数:

function array_usearch(array $array, callable $comparitor) {
    return array_filter(
        $array,
        function ($element) use ($comparitor) {
            if ($comparitor($element)) {
                return $element;
            }
        }
    );
}

这样做的好处是返回一个匹配的数组给比较函数,而不是单个的键,然后你需要查找。它还有O(n)的性能,这是可以接受的。
示例:
array_usearch($arr, function ($o) { return $o->name != 'zero'; });

0
print_r($json[array_search('zero', array_column(json_decode($json, true), 'name'))]->data);

3
请参阅解释完全基于代码的答案。虽然这可能在技术上是正确的,但它并没有解释为什么它解决了问题或应该被选为答案。我们应该在帮助解决问题的同时进行教育。 - annedroiid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接