从PHP对象动态选择属性

时间:2015-07-30 21:26:59

标签: php arrays

我有一个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。它真的很晚 - 抱歉,如果这是一个疯狂的问题

1 个答案:

答案 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;
相关问题