在Drupal 7站点上,我正在尝试构建一个数组(使用PHP 5.5),其中包含从另一个非常大的数组("raw_wrap")中提取的选择字段。我从中提取数据的字段被命名为"field_hours_1"、"field_hours_2"、"field_hours_3"等,所以我想我可以在每次传递时增加这些名称(而不是将它们全部分开放置)。 不幸的是,当打印出数组时,我在所有字段中都获得了相同的值。
下面是编写的代码:
$nid = arg(1);
$node = node_load($nid);
$wrapper = entity_metadata_wrapper('node', $node);
$raw_wrap = $wrapper->raw();
$days_array = array();
for( $x=1; $x<5; $x++ ) {
$ho = "raw_wrap->field_hours_" . $x . "['und'][0]['value']";
$days_array[$x]['hours_open'] = date('H:i', strtotime($ho));
$hc = "raw_wrap->field_hours_" . $x . "['und'][0]['value2']";
$days_array[$x]['hours_close'] = date('H:i', strtotime($hc));
}
然后打印出新数组给我:
Array
(
[1] => Array
(
[hours_open] => 18:00
[hours_close] => 18:00
)
[2] => Array
(
[hours_open] => 18:00
[hours_close] => 18:00
)
[3] => Array
(
[hours_open] => 18:00
[hours_close] => 18:00
)
[4] => Array
(
[hours_open] => 18:00
[hours_close] => 18:00
)
)
另请注意,数字(在本例中为"18:00")不会更改。 我到底如何让第二个数字更新 - 并且四个存储桶中的每一个的数字(打开和关闭时间)都不同?
以下是字段在较大数组("$raw_wrap")中的布局方式:
[field_hours_1] => Array
(
[und] => Array
(
[0] => Array
(
[value] => 0000-01-01 12:50:36
[value2] => 0000-01-01 23:50:36
[timezone] => America/Chicago
[timezone_db] => UTC
[date_type] => datetime
)
)
[field_hours_2] => Array
(
[und] => Array
(
[0] => Array
(
[value] => 0000-01-01 12:05:36
[value2] => 0000-01-01 22:05:36
[timezone] => America/Chicago
[timezone_db] => UTC
[date_type] => datetime
)
[field_hours_3] => Array
(
[und] => Array
(
[0] => Array
(
[value] => 0000-01-01 13:35:36
[value2] => 0000-01-01 22:35:36
[timezone] => America/Chicago
[timezone_db] => UTC
[date_type] => datetime
)
)
)
等等....
编辑:这似乎归结为:我可以通过以下内容添加到我的新数组中,但我想通过循环来做到这一点。
$days_array[]['hour_open'] = $raw_wrap->field_hours_1['und'][0]['value'];
$days_array[]['hour_open'] = $raw_wrap->field_hours_2['und'][0]['value'];
$days_array[]['hour_open'] = $raw_wrap->field_hours_3['und'][0]['value'];
我只是想不出增加"field_hours_"字段的方法。 例如,我没有运气用"$x"替换1,2和3。
我事先尝试过构建一个字符串,例如:
$hc = "raw_wrap->field_hours_" . $x . "['und'][0]['value2']";
$days_array[]['hours_close'] = date('H:i', strtotime($hc));
但这行不通。(它给出语法错误。
我尝试构建一个复合变量:
${"raw_wrap->field_hours_" . $x . "['und'][0]['value2']"}
我尝试简单地将变量放入字符串中,如下所示:
$raw_wrap->field_hours_$x['und'][0]['value2']
这又出现了另一个错误。我开始相信你不能通过使用循环中的变量更改它们的名称来添加这些字段。也许根本做不到?
这是语法。在循环中使用它:
$ho = $raw_wrap->{"field_hours_$x"}['und'][0]['value'];
$days_array[$x]['hours_open'] = date('H:i', strtotime($ho));
$hc = $raw_wrap->{"field_hours_$x"}['und'][0]['value2'];
$days_array[$x]['hours_close'] = date('H:i', strtotime($hc));
这是phpFiddle的完整测试代码:http://phpfiddle.org/main/code/gwme-zg8p