从PHP对象中动态选择属性
我有一个PHP对象数组(比如orders),其中包含这样的项目数组(JSON便于记法): 我试图用这种数组的标题创建一个CSV行。我使用的是一个键控数组,如下所示:从PHP对象中动态选择属性,php,arrays,Php,Arrays,我有一个PHP对象数组(比如orders),其中包含这样的项目数组(JSON便于记法): 我试图用这种数组的标题创建一个CSV行。我使用的是一个键控数组,如下所示: $settings = [ 'Order ID' => 'id', 'User ID' => 'user_id' ]; 所以现在我可以走了 $csv = []; $csv[] = array_keys($settings); foreach($orders as $order): $csv_row
$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' ]
是否有任何方法可以动态访问“更深层”的变量?i、 e.$order->items[0]->name
,类似于花括号表示法?我需要动态地做,因为有很多不同的对象和关系需要导出为CSV文件
附言:真的很晚了-如果这是一个疯狂的问题,很抱歉你不能使用大括号符号来深入到一个级别以上。您可以做的是使用一个helper函数,该函数允许您通过多级键获取值 一个示例函数可以是:
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;
您案例的示例使用模式可以是:
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;
它们只是数组,所以
$order[0]['name']
?如果不使用像eval
这样的邪恶工具,你就无法动态地构建那种数组“路径”,但是如果你知道你必须深入到数组中的“深度”,你就可以轻松地完成$order[$a][$b][$c]…
基本上就是我要说的。稍有不同的密码。如果你没有被困在互联网上,我会吻你。