在同一循环中将一个数组附加到另一个数组

问题描述 投票:0回答:2

这是一个自定义 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

以及我想看到的内容(注意 Post 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() 将它们连接起来,但这就是我无法进一步实现的地方。

有人可以解释一下吗?谢谢!

php mysql arrays merge
2个回答
0
投票

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

在你的两个数组

$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')

因此,这里只能存在一个值,就像合并数组中的“键”可以指向只有一个

如果是这种情况:

$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 的理解,你不能像这样传递参数(我不确定)。因此,实现这一目标只有一种方法。您可以分别传递这两个参数并合并结果,因为结果很可能(我不确定)将是一个二维数组,您可以轻松合并它们。

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


0
投票

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

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

否则我不确定你想要如何组合这两个数组。如果您澄清它们需要如何组合,我们也许能够提供更多帮助。

© www.soinside.com 2019 - 2024. All rights reserved.