基于PHP中的其他值循环遍历值

时间:2016-10-04 13:27:48

标签: php mysql

我从WordPress外部的WordPress数据库中获取以下SQL:

SELECT p.post_name, m.meta_key, m.meta_value FROM wp_postmeta m INNER JOIN wp_posts p ON m.post_id = p.post_name WHERE p.post_type = 'something' LIMIT 0, 100;

wp_posts中的

post_name包含特定帖子的ID,并与post_id中的wp_postmeta匹配。 meta_key包含字段名称,例如dateplace等。meta_value包含每个字段的值。

因此,每个帖子都有一组字段(meta_key),每个字段都有一个值(meta_value)。

我正试图在每个帖子中循环使用这些内容,但我尝试过的任何内容都没有效果。现在我有了这个,它显示了所有数据,但它遍历meta_values而不是显示每个post_id的meta_values。

$data = $result->fetch_assoc();
if ($result = mysqli_query($conn, $sql)) {
  while ($row = $result->fetch_assoc()) { ?>
  <li>
  <?php
    echo $row["meta_value"];        
  ?>  
  </li>
  <?php
    } $result->close();
  }
  ?>

这种方式让我:

<li>Post 1, meta value 1</li>
<li>Post 1, meta value 2</li>
<li>Post 2, meta value 1</li>
<li>Post 2, meta value 2</li>

但我需要

<li>Post 1, meta value 1 — Post 1, meta value 2</li>
<li>Post 2, meta value 1 — Post 2, meta value 2</li>

你有什么想法吗?

根据@ChristianF的评论进行更新。 foreach没有用,所以我尝试使用while。

结果有些奇怪,例如。来自帖子1的元值1重复多次。还有很多空的<li>元素,因此我猜测代码以某种方式为post_id的每一行打印<li>元素,即使并非所有meta_values都需要打印。我使用if语句包含了其中几个。我已经在代码下面插入了生成的HTML。

while ($row = $result->fetch_array()) {
if (!isset ($oldID)) {
    $oldID = $row['post_id'];
}

if ($oldID != $row['post_id']) {
    // Removing the last 3 characters from the output,
    // as we don't have any more items after this one.
    $postOut = substr ($postOut, 0, -4)."</li>\n<li>";
}

if ($row['meta_key'] == 'who_what') {
    $postOut .= $row['meta_value'];
} else if ($row['meta_key'] == 'place') {
    $postOut .= $row['meta_value'];
}

echo $postOut;
}

结果是巨大的,它似乎也切断了一些价值观。我没有包括整个结果。

<li></li>
</li>
<li></li>
</li>
</li>
<li>Meta_value from who_what key</li>
</li>
</li>
<li></li>
<li></li>
</li>
</li>
<li></li>
</li>
<li>Full meta_value from place key</li>
</li>
</li>
<li></li>
</li>
<li>Meta_value from place key missing last four characters</li>
<li></li>
</li>
</li>
<li></li>
</li>
<li>Meta_value from place key missing last four characters</li>
</li>
<li></li>
</li>
</li>
<li></li>
</li>
<li>Meta_value from place key missing last four characters</li>
</li>
</li>
<li></li>
</li>
</li>
<li></li>

1 个答案:

答案 0 :(得分:1)

您需要有一个变量,您要在其中存储帖子ID。然后检查每一行,如果它与当前行不同,则打印一个新行 换句话说就是这样:

// Start output with a list element.
$postOutput = '<li>':

foreach ($res->fetchArray () as $row) {
    // Prime the old ID, so that we can check against it later on.
    if (!isset ($oldID)) {
        $oldID = $row['post_id'];
    }

    // First, we need to end the old list item if we have a new post.
    if ($oldID != $row['post_id']) {
        // Removing the last 3 characters from the output,
        // as we don't have any more items after this one.
        $postOut = substr ($postOut, 0, -3)."</li>\n<li>";
    }

    // Adding the list element with the expectation of more
    // content to be atted to it later on.
    $postOut .= "Post #, meta ".$row['meta'].' - ';
}