如何通过递增字段标题中的数字从另一个数组中的字段构建数组
How to build an array from fields in another array by incrementing numbers in title of fields
在 Drupal 7 站点上,我正在尝试构建一个数组(使用 PHP 5.5),其中 select 字段来自另一个非常大的数组 ("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
在 Drupal 7 站点上,我正在尝试构建一个数组(使用 PHP 5.5),其中 select 字段来自另一个非常大的数组 ("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