【问题标题】:Appending one array to another array in the same loop在同一循环中将一个数组附加到另​​一个数组
【发布时间】:2012-09-22 14:28:25
【问题描述】:

这是一个自定义的 Wordpress 页面,但我认为基本的数组原则应该适用。我以前没有使用过复杂的数组,所以有点迷茫,试错还没有奏效。

我有一个帖子数据库,每个帖子都有“商店”和“过期”的元键。 'expired' 是一个日期 (YYYY-MM-DD),用于告诉访问者帖子的内容何时过期,而我正在尝试使用此密钥。

如果帖子的“过期”日期早于今天,则会显示“优惠已过期”

如果“过期”日期在未来,则会显示“优惠将在 X 天后过期”(此脚本未在下面显示,没有必要)

帖子按其“过期”日期(ASC)的顺序列出。问题是当帖子过期时,我希望该帖子显示在最后而不是停留在顶部。

我目前看到的示例:

Post 1 | Expired 3 days ago
Post 2 | Expired 1 day ago
Post 3 | Expires in 2 days
Post 4 | Expires in 6 days

以及我想看到的(注意 X 后顺序):

Post 3 | Expires in 2 days
Post 4 | Expires in 6 days
Post 2 | Expired 1 day ago
Post 1 | Expired 3 days ago

这是我尝试合并两者的数组代码

$postid = get_the_ID();
$meta1 = get_post_meta($postid, 'shop', true);
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$today = date('Y-m-d', time());

$args = array(
'post_type' => 'post',
'meta_query' => array(
    array(
        'key' => 'shop',
        'value' => $meta1
    )
),
'paged' => $paged,
'posts_per_page' => '5',
'meta_key' => 'expired',
'meta_value' => $today,
'meta_compare' => '>',
'orderby' => 'meta_value',
'order' => 'ASC'
 );

$args2 = array(
'post_type' => 'post',
'meta_query' => array(
    array(
        'key' => 'shop',
        'value' => $meta1
    )
),
'meta_key' => 'expired',
'meta_value' => $today,
'meta_compare' => '<',
'orderby' => 'meta_value',
'order' => 'DESC'
);

$final = $args + $args2;
$query = new WP_Query( $final );

while ( $query->have_posts() ) : $query->the_post(); ?>
HTML FOR DISPLAYING POST
endwhile;

目前它似乎没有注意到“$args2”,只显示$args

我确信我的想法是正确的,需要创建两个数组并使用“+”而不是 array_merge() 将它们连接起来,但这就是我无法进一步了解的地方。

有人可以请教一下吗?谢谢!

【问题讨论】:

  • array_merge 有什么问题?而且我没有想出任何使用+ 运算符来合并到数组?你能提供一些有关这方面的信息吗?
  • 我在 php.net/manual/en/function.array-merge.php 上使用示例 3 中的提示作为“+”运算符,如果我使用 array_merge(),则“args2”会覆盖“args”,因为它们共享键名。我的目标是拆分查询的结果:(1)一方发布日期>今天(活动)(2)另一方发布日期 5)。
  • 你能以 var_dump 格式分享你想要的数组吗?无论如何,这些信息很有用:)
  • 老实说,我不确定它在 var_dump 中的外观,我正在一起破解它,试图让它按原样工作!我只是想让查询根据“过期”元键值对帖子进行排序,将日期在“$today”之后的帖子放在顶部,然后在“$today”之前的日期放在它们之后,所以帖子仍然存在,但由于它已经“过期”,它不再需要在顶部!这是假设数组是正确的方法,我很确定它们是。

标签: mysql arrays merge


【解决方案1】:

您不能只使用 args+args2 语法将 2 个数组相加。 PHP 无法知道您的意思。如果您希望结果是包含这两个数组的数组,您可以这样做:

$final = 数组($args, $args2)

否则我不确定您希望如何组合这两个数组。如果您阐明它们需要如何组合,我们可能会提供更多帮助。

【讨论】:

  • 查看我上面的评论,我希望将查询结果拆分为已过期的帖子和将来“过期”的帖子。然后我需要首先在页面顶部显示所有未过期的帖子,一旦用尽,然后在第二个数组上开始一个 while 循环以显示过期的帖子。
  • 我对数组的 + 运算符进行了更正,但在你的情况下 + 运算符不应该做任何事情。 args2 中的所有键都已经存在于 args 中,因此它们不会被覆盖。你能告诉我们你想要 $final 的样子吗?
【解决方案2】:

如果我正确理解您的要求,现在您尝试实现的解决方案实际上是不可能的。让我解释一下为什么这无法实现。

在您的两个数组$args$args2 中,大多数值都是相同的,留下两个赔率,我只选择一个来说明:

//it's in args    
'meta_compare' => '>'
//it's in args2
'meta_compare' => '<'

现在,当您尝试使用 array_merge($args , $args2) 合并这两个时会发生什么:

'meta_compare' => '<'

这意味着它从后面的数组中获取“meta_compare”,这里是$args2。这是文档中定义的array_merge函数的行为:

If the input arrays have the same string keys, then the later value for that key will overwrite the previous one

现在如果您使用+ 数组联合运算符$args+$args2

'meta_compare' => '>'

这意味着它从第一个数组中获取“meta_compare”,这里是$args。这是文档中定义的+数组联合运算符的行为:

The keys from the first array will be preserved. If an array key exists in both arrays, then the element from the first array will be used and the matching key's element from the second array will be ignored.

为什么会这样,因为在同一级别 键必须是唯一的。因此,在您的情况下,它们处于同一水平:

$args = array ('key' => 'value1')
$args2= array ('key' => 'value2')

所以只有一个值可以存在这里,因为在合并数组中'key'可以指向只有一个强>。

如果是这样的话:

$args [0] = array ('key' => 'value1' ) 
$args2 [1]= array ('key' => 'value2' ) 

然后key 存储的两个值都将被保留。这将是结果数组:

array(2) {
  [0]=>
  array(1) {
    ["key"]=>
    string(6) "value1"
  }
  [1]=>
  array(1) {
    ["key"]=>
    string(6) "value2"
  }
}

虽然我不是 WP 的极客,但据我所知,WP_query 你不能像这样传递参数(我不确定)。因此,只有一种方法可以实现这一目标。您可以分别传递这两个 args 并将结果合并,因为结果很可能(我不确定)将是一个二维数组,您可以轻松地合并它们。

希望对您有所帮助。 快乐编码:)

【讨论】:

  • 这是一个很棒的帮助,非常感谢您的解释。您的解决方案建议也很有意义,所以我将开始测试并看看我在哪里。当/如果我得到我需要的东西时会更新这个。再次感谢。
  • 最后,我重新组织了将显示这些帖子的页面并分别调用这两个数组 - 给出的结果略有不同,但我实际上很满意。再次感谢,您将我推向了更好的方向。
  • 很高兴听到它对它有所帮助;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 2020-10-06
  • 2017-08-04
  • 1970-01-01
  • 2022-11-03
  • 1970-01-01
相关资源
最近更新 更多