【问题标题】:How can I get an object "key" from the value? Is there something like array_search for objects?如何从值中获取对象“键”?是否有类似 array_search 的对象?
【发布时间】:2012-09-13 04:51:34
【问题描述】:

我有这样的课:

stdClass Object
(
    [id] => 1
    [items] => stdClass Object
        (
            [0] => 123
            [1] => 234
            [2] => 345
            [3] => 456
        )
    )
)

让我们调用上面的对象$foo

假设$v = 234。给定$foo$v,如何返回“密钥”1

如果$foo->items 是一个数组,我会简单地使用$key = array_search($v,$foo->items);。但这在对象中不起作用。

如何在不循环访问某些foreach 中的对象的情况下找到$v 的密钥?

【问题讨论】:

    标签: php arrays object key


    【解决方案1】:

    正如您在示例中所示,您正在处理stdClass 对象。它们与数组非常相似,使用 PHP,您可以使用称为 casting 的东西轻松地在这两者之间进行转换:

    $object = $foo->items;
    $key = array_search($v, (array)$object);
                            ^^^^^^^--- cast to array
    

    正如这个小例子所示(我只是使用了$object 变量来使强制转换更加可见,您通常可以将其编写为单行),从对象到数组的强制转换确实允许您可以在对象上使用已知函数 (array_search)。

    因为 PHP 中的数组和 stdClass 对象非常相似,所以这在两个方向上都有效:

    $array  = ['property' => 'value'];
    $object = (object)$array;
    echo $object->property; # value
    

    这也适用于 PHP 中的其他类型,因此可能除了您的具体问题之外,还有一些值得阅读的内容:Type Juggling­Docs,但请注意,在 PHP 中这有许多特殊规则。但是在数组和对象之间,它非常简单。

    【讨论】:

    • 这比标记为正确的解决方案更简单、更干净。
    【解决方案2】:

    $key = array_search($v, get_object_vars($foo->items));

    编辑:试试this

    【讨论】:

    【解决方案3】:

    使用get_object_vars 并搜索返回的数组。

    参考http://php.net/manual/en/function.get-object-vars.php

    这是一个如何在返回的数组中搜索键的示例:

    <?php
    $foo = NULL;
    $foo->id = 1;
    $foo->items = array(123, 234, 345, 456);
    $foo_array = get_object_vars($foo);
    print_r($foo_array);
    
    foreach ($foo_array as $key => $value) {
        if ($value == 1) {
            echo $key;
        }
    }
    ?>
    

    输出:

    Array
    (
        [id] => 1
        [items] => Array
            (
                [0] => 123
                [1] => 234
                [2] => 345
                [3] => 456
            )
    
    )
    id
    

    密码板http://codepad.org/in4w94nG

    【讨论】:

    • 但是 $foo->items 不是一个数组。它看起来像一个数组。它是一个对象。我很难完成这项工作。
    • 啊,我明白了。 $key = array_search($v, get_object_vars($foo-&gt;items)); 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多