在对象数组上使用php的array_search

时间:2016-08-05 18:08:57

标签: php arrays

bootstrap允许我根据数组值找到第一个数组键。

如果值嵌套在数组值的对象中,或者必须手动执行,如下所示,可以使用单个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

2 个答案:

答案 0 :(得分:4)

只是为了好玩,如果数组基于0和顺序键:

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

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

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

答案 1 :(得分:3)

没有单一的内置函数可以进行任意比较。但是,您可以滚动自己的通用数组搜索:

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'; });