【问题标题】:PHP each or foreach to print dataPHP each 或 foreach 打印数据
【发布时间】:2016-02-20 19:22:06
【问题描述】:

首先,感谢您的关注!

运行查询后,我得到如下结果:

--------------------------------------
|post_id|   meta_key   |  meta_value |
--------------------------------------
|   1   |     name     |    jeff     |
--------------------------------------
|   1   |     email    |  x@mail.com |
--------------------------------------
|   1   |     color    |     blue    |
--------------------------------------
|   2   |     name     |    mary     |
--------------------------------------
|   2   |     email    |  y@mail.com |
--------------------------------------
|   2   |     color    |     pink    |
--------------------------------------

数组

array(6) 
{ 
    [0]=> object(stdClass)#448 (3) 
        { 
            ["post_id"]     => string(1) "1" 
            ["meta_key"]    => string(4) "name" 
            ["meta_value"]  => string(4) "jeff" 
        } 
    [1]=> object(stdClass)#449 (3) 
        { 
            ["post_id"]     => string(1) "1" 
            ["meta_key"]    => string(4) "email" 
            ["meta_value"]  => string(10) "x@mail.com" 
        } 
    [2]=> object(stdClass)#450 (3) 
        { 
            ["post_id"]     => string(1) "1" 
            ["meta_key"]    => string(5) "color" 
            ["meta_value"]  => string(4) "blue" 
        } 
    [3]=> object(stdClass)#448 (3) 
        { 
            ["post_id"]     => string(1) "2" 
            ["meta_key"]    => string(4) "name" 
            ["meta_value"]  => string(4) "mary" 
        } 
    [4]=> object(stdClass)#449 (3) 
        { 
            ["post_id"]     => string(1) "2" 
            ["meta_key"]    => string(4) "email" 
            ["meta_value"]  => string(10) "y@mail.com" 
        } 
    [5]=> object(stdClass)#450 (3) 
        { 
            ["post_id"]     => string(1) "2" 
            ["meta_key"]    => string(5) "color" 
            ["meta_value"]  => string(4) "pink" 
        } 

}

嗯,我有 3 个标签和 3 个值的 1 个 ID。使用 PHP,我需要知道如何执行 foreach 或 each 来打印这样的数据:

---------------------------------------------------
|post_id|    name      |    email    |   color    |
---------------------------------------------------
|   1   |    jeff      |  x@mail.com |   blue     |
---------------------------------------------------
|   2   |    mary      |  y@mail.com |   pink     |
---------------------------------------------------

现在,在 Kostas Mitsarakis 的帮助下,我有一个代码,但就我而言,此代码返回 NULL 值。

代码:

global $wpdb;

$meta_value = interested_get_meta( 'interested_email' );
$results = $wpdb->get_results( 
       'SELECT post_id, meta_key, meta_value 
        FROM wp_postmeta 
        WHERE post_id 
        IN (    SELECT post_id 
                FROM wp_postmeta 
                WHERE meta_value = "'.$meta_value.'"
            )', OBJECT
);

$data = array();
$result = array($results);

foreach($result as $key => $value) {
    if (!in_array($value['post_id'], $data)) {
        $data[$value['post_id']]['post_id'] = $value['post_id'];
    }
    if ($value['meta_key'] != 'post_id') {
        $data[$value['post_id']][$value['meta_key']] =     $value['meta_value'];
    }
}

var_dump($data);

var_dump 的返回值:

array(1) { [""]=> array(2) { ["post_id"]=> NULL [""]=> NULL } }

【问题讨论】:

  • 你能显示查询吗?我认为如果您使用 SQL 获得权限结果会更好。
  • 执行GROUP BY id 和 ORDER BY,然后将其设置在 HTML 格式的表格中。
  • 您可以运行并以 3 为模,但更好的解决方案是修改查询
  • 注释掉 // $data = array();然后代替: $results = $wpdb->get_results... 写: $data = $wpdb->get_results... 因为您使用 $data 在这种情况下为空。
  • Kostas,在进行了建议的更改后,我将相同的数组放入了一个没有重大更改的新数组中。也许我做的不对。插入有问题的数组是我的查询得到的。也许这有助于展示我手头的东西。

标签: php wordpress foreach each


【解决方案1】:

您可以使用简单的 foreach 转换您的数组:

$output = array();
foreach ($input as $data) {
    $output[$data['id']]['id'] = $data['id'];
    $output[$data['id']][$data['label']] = $data['value'];
}

【讨论】:

  • 感谢您的合作。您的代码首先运行不正常,因为我最初的问题没有很好地表述。但是,是您的代码详细说明,让我得到所需的解决方案,并在此处分享该主题。
【解决方案2】:

我同意上面 cmets 中的@KostasMitsarakis 的观点,这可能在 sql 级别上做得更好。

但是这里是您可能正在寻找的 php 代码:

<?php

$input = [
    [
        'id'    => 1,
        'name'  => 'jeff',
        'email' => 'x@mail.com',
        'color' => 'blue',
    ],
    [
        'id'    => 2,
        'name'  => 'mary',
        'email' => 'y@mail.c',
        'color' => 'pink',
    ]
];

$output = [];
foreach ($input as $entry) {
    $element = [];
    foreach($entry as $key=>$val) {
        $element[$key] = $val;
    }
    $output[] = $element;
}


var_dump($output);

这个输出是:

array(2) {
  [0] =>
  array(4) {
    'id' =>
    int(1)
    'name' =>
    string(4) "jeff"
    'email' =>
    string(10) "x@mail.com"
    'color' =>
    string(4) "blue"
  }
  [1] =>
  array(4) {
    'id' =>
    int(2)
    'name' =>
    string(4) "mary"
    'email' =>
    string(8) "y@mail.c"
    'color' =>
    string(4) "pink"
  }
}

【讨论】:

  • @JeffersonVasconcelos 它肯定不是您开始使用的数组,因为它的结构完全不同:每个 ID 一行(条目),而不是单个的多个和所有属性一行中的 ID(条目)。而且我绝对不明白为什么这段代码应该限制在条目的数量上。相反,它实际上是这样实现的,无论您在开始时有多少个 ID 和每个 ID 有多少属性,它都能正常工作。所以:你真的看过这个答案吗? :-)
  • @JeffersonVasconcelos 事情是您显然修改了您的问题,但没有说明或这么说。所以现在很明显,您的条目实际上是对象,而不是数组,正如这里每个人所期望的那样,这就是为什么我的代码可能无法处理您的数据的原因。然而,这并不是因为代码返回的数组与您输入的相同(这绝对不是),而是因为您更改了要解决的任务。很抱歉。
  • @Arkasha 首先感谢您的关注。经过一番帮助,我意识到可能我的问题不是很清楚,这可能发生在像我这样不会编程的人身上很正常。因此实现了问题的改变。我希望人们能更好地理解我的问题以寻求帮助。很抱歉,我错误地提出了原始问题。
  • @JeffersonVasconcelos 很好,我对问题已更改这一事实完全没有问题。相反,使问题更精确显然是一件非常好的事情。我想在这里补充的是,您可能想在问题中说明您更改了它,为什么这样做以及实际更改是什么。但是,我仍然完全不明白的是您声称上面的代码输出与输入的相同。显然不是这样。
【解决方案3】:

好吧,经过几个小时和咖啡,在所有写在这里的人的帮助下,我找到了解决方案。

$meta_value = interested_get_meta('interested_email');

    global $wpdb;
    $results = $wpdb->get_results( 
           'SELECT post_id, meta_key, meta_value 
            FROM wp_postmeta 
            WHERE post_id 
            IN (    SELECT post_id 
                    FROM wp_postmeta 
                    WHERE meta_value = "'.$meta_value.'"
                )', OBJECT
    );

    $data = array();

    if (is_array($results)) {
        foreach($results as $item) {
            $data[$item->post_id]['post_id']           = $item->post_id;
            $data[$item->post_id][$item->meta_key]  = $item->meta_value;
        }
    } 

    foreach ($data as $key => $value) { ?>
        <li>
            <?php echo $value['post_id'];?><br/>
            <?php echo $value['name'];?><br/>
            <?php echo $value['color'];?><br/>
        </li>
    <?php }

感谢所有以任何方式提供帮助的人!

【讨论】:

    【解决方案4】:

    尝试使用ARRAY_A 将结果作为数组获取。

    $meta_value = interested_get_meta( 'interested_email' );
    $results = $wpdb->get_results( 
           'SELECT post_id, meta_key, meta_value 
            FROM wp_postmeta 
            WHERE post_id 
            IN (    SELECT post_id 
                    FROM wp_postmeta 
                    WHERE meta_value = "'.$meta_value.'"
                )', ARRAY_A
    );
    
    $data = array();
    $result = json_decode($results , true); //Return results as array
    
    foreach($result as $key => $value) {
        if (!in_array($value['post_id'], $data)) {
            $data[$value['post_id']]['post_id'] = $value['post_id'];
        }
        if ($value['meta_key'] != 'post_id') {
            $data[$value['post_id']][$value['meta_key']] = $value['meta_value'];
        }
    }
    echo 'id name email color <br />';
    foreach($data as $key => $value) {
        echo $value['post_id'].' '.$value['name'].' '.$value['email'].' '.$value['color'].'<br />';
    }
    
    var_dump($data);
    

    结果(表格)

    id name email color
    1 jeff x@mail.com blue
    2 mary y@mail.com pink
    

    结果(var_dump)

    array (size=2)
      1 => 
        array (size=4)
          'post_id' => int 1
          'name' => string 'jeff' (length=4)
          'email' => string 'x@mail.com' (length=10)
          'color' => string 'blue' (length=4)
      2 => 
        array (size=4)
          'post_id' => int 2
          'name' => string 'mary' (length=4)
          'email' => string 'y@mail.com' (length=10)
          'color' => string 'pink' (length=4)
    

    【讨论】:

    • 科斯塔斯,感谢您的帮助。您的代码在您编写时运行良好。但是,就我而言,请求返回的是空数组。我将修改我的问题,输入您提供的代码以显示我的问题。
    • 注释掉 // $data = array();然后代替: $results = $wpdb->get_results... 写: $data = $wpdb->get_results... 因为您使用 $data 在这种情况下为空。
    猜你喜欢
    • 1970-01-01
    • 2015-05-10
    • 2014-10-25
    • 1970-01-01
    • 2012-11-09
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多