我有一个PHP对象数组(比如命令),它们有像这样的项目数组(为了便于表示,JSON):
1,2
我正在尝试使用这种数组的标题创建一个CSV行。我正在使用像这样的键控数组:
$orders = [
{
id: 87,
user_id: 6,
menu_id: 9,
items: [
{
id: 1,
name: "Item 1",
}
]
},
{
id: 88,
user_id: 3,
menu_id: 6,
items: [
{
id: 2,
name: "Item 2",
}
]
}
]
所以现在我可以去......
$settings = [
'Order ID' => 'id',
'User ID' => 'user_id'
];
这给了我:
$csv = [];
$csv[] = array_keys($settings);
foreach($orders as $order):
$csv_row = [];
foreach($settings as $column);
$csv_row[] = $order->{$column};
endforeach;
$csv[] = $csv_row;
endforeach;
有什么方法可以动态访问“更深层”变量吗?即[ 'Order ID', 'User ID' ]
[ '87', '6' ]
[ '88', '3' ]
,与大括号表示法类似?我需要动态地执行它,因为我需要将许多不同的对象和关系导出为CSV文件。
<子> P.S。它真的很晚 - 抱歉,如果这是一个疯狂的问题
答案 0 :(得分:2)
您不能使用花括号表示法来深入到一个级别。你可以做的是使用一个帮助函数,让你通过多级键获取值。
示例函数可以是:
function getByPath($value, array $path)
{
if (empty($path)) return $value;
if (!is_array($value)) return;
if (array_key_exists($path[0], $value)) return getByPath($value[$path[0]], array_slice($path, 1));
}
您案例的使用模式示例可能是:
$settings = [
'Order ID' => ['id'],
'User ID' => ['user', 'id'],
'User Name' => ['user', 'name'],
'Item 0 Name' => ['item', 0, 'name'],
'Item 0 Price' => ['item', 0, 'price']
];
foreach($settings as $path);
$csv_row[] = getByPath($order, $path);
endforeach;