MySQL行数据到PHP数组键/值

时间:2012-08-09 18:15:07

标签: php mysql wordpress

所以我试图将一些Wordpress与后端集成。他们的MySQL架构不是太好,尤其是当您添加Woocommerce时。

我想出了以下问题:

SELECT wp.* 
FROM   wp_postmeta wp
       INNER JOIN (SELECT post_id 
                   FROM   wp_postmeta
                   WHERE  ( `meta_key` = '_shipping_method' 
                            AND `meta_value` = 'free_shipping' ) 
                           OR ( `meta_key` = '_order_items' 
                                AND `meta_value` LIKE '%search%' )) a 
               ON a.post_id = wp.post_id 
ORDER  BY wp.post_id DESC

要在此表http://i.imgur.com/YBaGq.jpg上运行,为某些人选择正确的内容。

现在当我在PHP中使用var_dump时,它就像这样(截断) - http://pastebin.com/WR3byT8k

有没有什么方法可以将它正确映射到数组,以便我可以使用简单的东西:

echo $content['_billing_first_name']; 
echo $content['_billing_last_name'];

哪个会输出:
John Citizen

请记住,所有内容都是动态的,所以我不能只使用行号。

1 个答案:

答案 0 :(得分:0)

如果您需要检索一组固定的元键(不一定是固定的顺序),您可以使用类似于数据透视表的技术在查询本身中执行此操作。

SELECT 
  post_id,
  MAX(CASE WHEN meta_key = '_billing_first_name' THEN meta_value ELSE NULL END) AS _billing_first_name,
  MAX(CASE WHEN meta_key = '_billing_last_name' THEN meta_value ELSE NULL END) AS _billing_last_name,
  MAX(CASE WHEN meta_key = '_some_other_attribute' THEN meta_value ELSE NULL END) AS _some_other_attribute,
  MAX(CASE WHEN meta_key = '_another_attribute' THEN meta_value ELSE NULL END) AS _another_attribute,
  ...
  ...
FROM wp_post_meta
GROUP BY post_id

CASE语句确定要拉出的参数并将其分配给列。它们被包装在MAX()聚合中,只是为了消除当键不匹配时产生的NULL,将其折叠为单行,每行都有列,而不是多行,其中大多数是NULL值。

如果失败(如果您的属性集意外变化),则需要迭代代码。那会很麻烦。

在PHP中:

使用PHP,如果你有一个想要检索的元发布密钥数组,你可以循环遍历所有行,如果meta_key是你想要的那个,那么将meta_value存储到一个数组中:

// Assumes your WP query results are already stored into the array $your_db_rows

// Will hold your final processed results
$output = array();
// If you want only a specific set of meta_key names rather than all meta_key names
$keys_you_want = array('_billing_first_name','_billing_last_name','_some_other_attribute');

// Loops over the result set
foreach ($your_db_rows_array as $row) {
  // If the current row holds one of the meta_key you are looking for
  if (in_array($row['meta_key'], $keys_you_want)) {
    // Put it onto the output array using the meta_key as the array key
    $output[$row['meta_key'] = $row['meta_value'];
  }
  // Otherwise do nothing...
}
var_dump($output);

要获取所有meta_key,请忽略in_array()测试和$keys_you_want数组。这会将遇到的每个meta_key存储到$output

// Loops over the result set for all values of meta_key, not a specific set
foreach ($your_db_rows_array as $row) {
  // Put it onto the output array using the meta_key as the array key
  $output[$row['meta_key'] = $row['meta_value'];
}
var_dump($output);