能够在print_r()的输出中看到变量,但不知道如何在代码中访问它

时间:2011-06-12 13:02:55

标签: php drupal drupal-7

我用Google搜索,为Firebug安装了Devel,Drupal,但我找不到它。

我找到我想要的,我知道其中;我只是不知道如何来获得它。

我会把它放在代码括号中,但是Devel告诉我文件名(我想留在.tpl.php文件中)在这里:

field_image (Object) stdClass 
  handler (Object) views_handler_field_field 
    view (Object) view 
      result (Array, 2 elements) 
        0 (Object) stdClass 
          _field_data (Array, 1 element) 
            nid (Array, 2 elements) 
              entity (Object) stdClass
                field_image (Array, 1 element) 
                  und (Array, 1 element)
                    0 (Array, 11 elements)                                      
                      filename (String, 23 characters ) FILENAME.jpg

那么,如何使用PHP输出FILENAME.jpg?

<?php print $something->other; ?>

9 个答案:

答案 0 :(得分:17)

每当您需要从变量中读取值时,您需要知道需要制定哪个表达式来访问该值。

对于一个简单的变量值,这很简单,您只需获取变量名称并将其作为变量访问,方法是在其前面添加$符号:

var_dump($variable);

is documented here

但是,这仅适用于stringinteger等简单数据类型。还有复合数据类型,即arrayobject。它们可以包含更多数据类型,无论是简单还是复合。您可以在PHP手册中学习如何access the values of an array以及如何you can access them from an object。我想你已经知道了一点,所以只是把它链接在这里。

当您了解了这一点后,您就可以将其结合起来。例如。如果对象中有一个数组,并且其中有一个你想要获得的字符串,则需要将$符号和变量名称与所需的访问器,属性名称和数组键组合在一起。然后你就得到了你的价值。您发布的数据显示您有一个包含其他对象和数组的对象,最后您会找到变量名称。

一些组合示例:

var_dump($variable->handler->view[0]->_field_data);

这是基于您在上面提供的数据。 $variable是您开始的地方,->用于访问需要命名的对象成员(如变量的名称):handler。正如您在调试输出中看到handler是一个对象,您需要再次使用->来访问view成员。

现在view是不同的,因为它是一个数组。您可以使用[]并将密钥放在那里来访问数组的值。我的示例中的关键字是数字0。由于该数组条目的值再次成为对象,因此在下一步中您需要再次使用->

您可以继续此游戏,直到找到您感兴趣的元素。您已有的调试输出可帮助您编写返回值的表达式。可能是:

$field_image->handler->view->result[0]->_field_data['nid']['entity']->field_image['und'][0]['filename']

但我无法在我的系统上完整验证。

然而,当发现问题时,使用var_dump是有帮助的,因为您可以一步一步地扩展表达式,直到找到元素。如果你犯了错误,你会立即看到。有时,在die();语句之后放置var_dump有助于在响应包含之前将响应结束到将隐藏您的信息的其他数据。 devel插件提供了额外的调试例程来转储突出显示的值。

答案 1 :(得分:6)

如果这是你的对象:

field_image (Object) stdClass 
  handler (Object) views_handler_field_field 
    view (Object) view 
      result (Array, 2 elements) 
        0 (Object) stdClass 
          _field_data (Array, 1 element) 
            nid (Array, 2 elements) 
              entity (Object) stdClass
                field_image (Array, 1 element) 
                  und (Array, 1 element)
                    0 (Array, 11 elements)                                      
                      filename (String, 23 characters ) FILENAME.jpg

我猜您可以使用以下方式找到它:

field_image->handler->view->result[0]->_field_data['nid'][entity]->field_image['und'][0]['filename]

可能是一个错误,但一般的想法是:如果你有一个对象,使用->获取变量,如果你有一个数组,使用[key]

答案 2 :(得分:4)

假设您在$ node中有一个节点对象。您可以使用以下方式打印它的值:

dpm($node); // remember this function is declared in devel module

然后,您可以从$ node查看信息,并通过单击展开内部字段。双击该字段,您可以看到它的php路径。

Devel Information of a Drupal node object

你会得到这个结果:

Devel showing the path after double clicking a field

希望有所帮助!

PD:我想这个功能在D6的dpm上不可用。

答案 3 :(得分:3)

尝试:

$field_image->handler->view->result[0]->_field_data['nid']['entity']->field_image['und'][0]['filename']

答案 4 :(得分:0)

如果您已安装devel并尝试

krumo ($variable);

请记住,默认情况下,只有管理员用户有权使用krumo命令,但可以通过查看DEVEL角色权限来解决此问题。 (尽管如此,请不要忘记删除这些权限)

答案 5 :(得分:0)

<? print_r($something["other"]); ?>

(其他的是这个) 所以结果就是'这个'

答案 6 :(得分:0)

让我总结一下

print_r($data); => Traditional view of printing array.

var_dump($data); => Not so much cleaned view , gives you everything but in very suffocated manner

print "<pre>"; print_r($data); => A cleaned view but will not get   data types information.

dpm($data); => It gives you everything, but you need to have installed devel.

答案 7 :(得分:0)

你应该使用field_view_field($ entity_type,$ entity,$ field_name,$ display = array(),$ langcode = NULL),这将返回可渲染数组。您可以查看api文档https://api.drupal.org/api/drupal/modules%21field%21field.module/function/field_view_field/7.x

答案 8 :(得分:0)

如果由于某种原因你不能使用devel模块,另一个有用的“调试”函数可能是var_export()和一个Drupal包装器drupal_var_export()。这些函数将输出作为PHP代码。