从PHP对象中动态选择属性

从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

我有一个PHP对象数组(比如orders),其中包含这样的项目数组(JSON便于记法):

我试图用这种数组的标题创建一个CSV行。我使用的是一个键控数组,如下所示:

$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]…
基本上就是我要说的。稍有不同的密码。如果你没有被困在互联网上,我会吻你。