从数组中提取数据PHP

时间:2018-10-17 11:18:36

标签: php arrays wordpress loops

问题。

我有一个Wordpress高级自定义字段数据数组,这些数据是我使用SQL从数据库中提取到PHP数组中的。

$wp_postmeta = array(
  array('meta_id' => '3784','post_id' => '180','meta_key' => 'press_0_title','meta_value' => 'The first title'), // Want 
  array('meta_id' => '3785','post_id' => '180','meta_key' => '_press_0_title','meta_value' => 'field_52d67eb94ac55'), // Dont want 
  array('meta_id' => '3786','post_id' => '180','meta_key' => 'press_0_date','meta_value' => 'November-17'), // Want
  array('meta_id' => '3787','post_id' => '180','meta_key' => '_press_0_date','meta_value' => 'field_52d67f094ac58'), // Dont want
  array('meta_id' => '3837','post_id' => '180','meta_key' => 'press_1_title','meta_value' => 'The second title'), // Want
  array('meta_id' => '3830','post_id' => '180','meta_key' => '_press_1_title','meta_value' => 'field_52d67eb94ac55'), // Dont want
  array('meta_id' => '3839','post_id' => '180','meta_key' => 'press_1_date','meta_value' => 'October-17'), // Want 
  array('meta_id' => '3832','post_id' => '180','meta_key' => '_press_1_date','meta_value' => 'field_52d67f094ac58') // Dont want
);

它们包括完整的title和date值,但被分为多个单独的数组,我需要将其分为相应的组,例如您可以在下面的解决方案中看到来自press_0_,press_1_等的日期和标题,它返回所需格式的数据。

我的解决方案

// This is the array I need to pull the data from.

$wp_postmeta = array(
  array('meta_id' => '3784','post_id' => '180','meta_key' => 'press_0_title','meta_value' => 'The first title'), // Want 
  array('meta_id' => '3785','post_id' => '180','meta_key' => '_press_0_title','meta_value' => 'field_52d67eb94ac55'), // Dont want 
  array('meta_id' => '3786','post_id' => '180','meta_key' => 'press_0_date','meta_value' => 'November-17'), // Want
  array('meta_id' => '3787','post_id' => '180','meta_key' => '_press_0_date','meta_value' => 'field_52d67f094ac58'), // Dont want
  array('meta_id' => '3837','post_id' => '180','meta_key' => 'press_1_title','meta_value' => 'The second title'), // Want
  array('meta_id' => '3830','post_id' => '180','meta_key' => '_press_1_title','meta_value' => 'field_52d67eb94ac55'), // Dont want
  array('meta_id' => '3839','post_id' => '180','meta_key' => 'press_1_date','meta_value' => 'October-17'), // Want 
  array('meta_id' => '3832','post_id' => '180','meta_key' => '_press_1_date','meta_value' => 'field_52d67f094ac58') // Dont want
);

// These are the loops I have run to pull the data.

$counter = 0;
$keys = [];

foreach ($wp_postmeta as $meta) {
  $titleKey = 'press_'.$counter.'_title';
  $dateKey = 'press_'.$counter.'_date';

  $key = [];

  $key['title-key'] = $titleKey;
  $key['date-key'] = $dateKey;

  array_push($keys, $key);

  $counter++;
}

foreach ($keys as $key) {
  $titleKey = $key['title-key'];
  $title;
  $dateKey = $key['date-key'];
  $date;

  foreach ($wp_postmeta as $meta) {
    if ($meta['meta_key'] == $titleKey) {
      $title = $meta['meta_value'];
    }

    if ($meta['meta_key'] == $dateKey) {
      $date = $meta['meta_value'];
    }
  }

  // This is the data I want from the array.

  echo 'title - ' . $title . '<br>';
  echo 'date - ' . $date  . '<br>';
}

// This returns

title - The first title
date - November-17

title - The second title
date - October-17

我的问题

我是否可以进行一些改进以重构它以使其更清洁?如果可能的话,它将大大提高我的PHP知识。

1 个答案:

答案 0 :(得分:2)

您可以使用array_column使用Optionall index_key在输入数组中获取单个列。

尝试这种方式。

    $wp_postmeta_info = array_column($wp_postmeta, 'meta_value', 'meta_key');
    for($i = 0; $i < count($wp_postmeta_info); $i++ ){
       if(!isset($wp_postmeta_info['press_'.$i.'_title'])){
            continue;
        }
        $data[] = ['title' => $wp_postmeta_info['press_'.$i.'_title'], 'date' => $wp_postmeta_info['press_'.$i.'_date']];
    }
    return $data;