通过属性搜索数组中对象的有效方法

And*_*dez 9 php arrays

好吧,有类似的东西:

$array[0]->id = 'one';
$array[0]->color = 'white';
$array[1]->id = 'two';
$array[1]->color = 'red';
$array[2]->id = 'three';
$array[2]->color = 'blue';
Run Code Online (Sandbox Code Playgroud)

什么是最快,最有效的方法来实现像这样的方法

function findObjectById($ id){}

如果我调用它将返回对象$ array [0]:

$obj = findObjectById('one')
Run Code Online (Sandbox Code Playgroud)

如果我把'四'作为一个参数传递,它将返回false.

hak*_*kre 44

对于规范参考:

$obj = array_column($array, null, 'id')['one'] ?? false;
Run Code Online (Sandbox Code Playgroud)

根据false问题要求返回 false。它代表不匹配的值,例如您可以将其null作为替代建议。

从 PHP 7.0 开始,这是透明的。如果您(仍然)拥有旧版本,则可以将其用户空间实现用作直接替代版本。

array_column也意味着复制整个数组。这可能是不需要的。

相反,它可以用于索引数组,然后映射到array_flip

$index = array_column($array, 'id');
$map = array_flip($index);
$obj = $array[$map['one'] ?? null] ?? false;
Run Code Online (Sandbox Code Playgroud)

在索引上,搜索问题可能仍然相同,地图仅提供原始数组中的索引,因此存在一个参考系统。

请记住,这可能不是必需的,因为 PHP 具有写时复制。因此,正如有意想象的那样,重复可能会更少。所以这是为了展示一些选项。


另一种选择是遍历整个数组,除非已经找到该对象,否则检查是否匹配。一种方法是使用array_reduce

$obj = array_reduce($array, static function ($carry, $item) {
    return $carry === false && $item->id === 'one' ? $item : $carry;
}, false);
Run Code Online (Sandbox Code Playgroud)

该变体同样具有false不匹配的返回要求。

这是更直接一点null

$obj = array_reduce($array, static function ($carry, $item) {
    return $carry ?? ($item->id === 'one' ? $item : $carry);
}, null);
Run Code Online (Sandbox Code Playgroud)

然后可以添加不同的不匹配要求$obj = ...) ?? false;

完全暴露在foreach它自己的函数中甚至有在匹配时直接退出的好处:

$result = null;
foreach ($array as $object) {
    if ($object->id === 'one') {
        $result = $object;
        break;
    }
}
unset($object);
$obj = $result ?? false;
Run Code Online (Sandbox Code Playgroud)

这实际上是hsz的原始答案,它显示了它的应用范围。


Amm*_*eel 15

i:是数组中项目的索引

1: 是寻找的财产价值

$arr:查看内部的数组

'ID':属性键

$i = array_search(1, array_column($arr, 'ID'));
$element = ($i !== false ? $arr[$i] : null);
Run Code Online (Sandbox Code Playgroud)


hsz*_*hsz 8

您可以迭代这些对象:

function findObjectById($id){
    $array = array( /* your array of objects */ );

    foreach ( $array as $element ) {
        if ( $id == $element->id ) {
            return $element;
        }
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

更快的方法是使用一个数组,其中键等于对象的id(如果是唯一的);

然后你可以建立你的功能如下:

function findObjectById($id){
    $array = array( /* your array of objects with ids as keys */ );

    if ( isset( $array[$id] ) ) {
        return $array[$id];
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)


小智 8

你可以像这样使用php的array_search函数

$key=array_search("one", array_column(json_decode(json_encode($array),TRUE), 'color'));
var_dump($array[$key]);
Run Code Online (Sandbox Code Playgroud)

  • 请注意 `array_column` 仅适用于 PHP > 5.5.0 (2认同)
  • 带有对象的数组仅在 PHP > 7.0 中可用 (2认同)
  • 这种方法不是最有效的原因是,(忽略提取不必要的 json 操作)`array_column()` 将遍历整个数组,然后 `array_search()` 将再次遍历整个数组。本页演示了更简单/更高性能的技术。 (2认同)