使用array_push()时如何控制数组键?

时间:2016-08-04 12:50:16

标签: php arrays

我有一个如下所示的数组:

$date_data = array(
                $date_title => array(
                    'title' => get_field('jahr'),
                    'permalink' => get_the_permalink(),
            )
);

此数组位于循环内,并被推送到数组$archive_years。如果$date_title的值已作为数组中的键存在,我不希望它被复制,因此应将值推送到现有键。

目前正是如此:

array(2) {
  [0]=>
  array(1) {
    ["2020 - 2010"]=>
    array(2) {
      ["title"]=>
      string(4) "2013"
      ["permalink"]=>
      string(68) "http://example.com"
    }
  }
  [1]=>
  array(1) {
    ["2020 - 2010"]=>
    array(2) {
      ["title"]=>
      string(4) "2016"
      ["permalink"]=>
      string(66) "http://example.com/example"
    }
  }
}

如您所见2020 - 2010列出两次。如何将我的值(get_field('jahr')get_the_permalink())分配给现有密钥,因此没有重复的密钥?

这是整个代码:

$archive_years = array();
$args = array( 'post_type' => 'archiv');
$loop = new WP_Query($args);
while ($loop->have_posts()) : $loop->the_post();        

    // Specify the interval
    $date_up = ceil(get_field('jahr') / 10) * 10;
    $date_down = ceil(get_field('jahr') / 10) * 10 - 10;
    $date_title = $date_up . ' - ' . $date_down;

    $date_data = array(
                    $date_title => array(
                        'title' => get_field('jahr'),
                        'permalink' => get_the_permalink(),
                )
    );
    if (!array_key_exists($date_title, $archive_years)) { 
        array_push($archive_years, $date_data);
    }

endwhile;

foreach ($archive_years as $key => $value) {
    foreach ($value as $k => $v) {
        echo '
            <button type="button" class="btn btn-info collapsible" data-toggle="collapse" data-target="#archiv_'. $v['title'] .'">'. $k .'</button>
            <div id="archiv_'. $v['title'] .'" class="collapse">
                <a href="'. $v["permalink"] .'">'. $v["title"] .'</a><br>
            </div>';
    }
}

var_dump($archive_years);

4 个答案:

答案 0 :(得分:0)

我认为你想要的是array_merge而不是array_push

http://php.net/manual/en/function.array-merge.php

答案 1 :(得分:0)

array(2) {
  [0]=>
  array(1) {
    ["2020 - 2010"]=> ...
  }
  [1]=>
  array(1) {
    ["2020 - 2010"]=> ...
  }
}

这个数组结构对于您的目的来说是无稽之谈。您只需要一个级别的数组:

array(0) {
  ["2020 - 2010"]=> ...
}

要实现这一目标,请执行以下操作:

$archive_years[$date_title] = array(
    'title' => get_field('jahr'),
    'permalink' => get_the_permalink()
);

答案 2 :(得分:0)

这样你可以检查密钥是否存在并将其推送到数组:

if (!array_key_exists($date_title, $archive_years)) {
    $archive_years[$date_title] = array();
}
array_push($archive_years[$date_title], $date_data);

答案 3 :(得分:-1)

你的逻辑中只是一个错误。请考虑以下代码的摘录:

$date_title => array(
                    'title' => get_field('jahr'),
                    'permalink' => get_the_permalink(),
            )
);
if (!array_key_exists($date_title, $archive_years)) { 

回想一下array_key_exists()的{​​{3}}定义如下:

bool array_key_exists (mixed $key, array $search)

因此,您尝试用作“数组键”的是一个数组本身。你不能这样做。 (但是,PHP可能不会告诉你。它可能只是做错了。)

您将需要包含一个循环,用于搜索您的数组,深入比较每个元素与$date_title,以确定它是否已存在。或者,您可能希望使用另一个数组,例如title索引,以快速确定之前是否提及过某个特定标题。

进一步扩展上述概念,您可以通过titlepermalink连接索引“另一个数组”,以便快速检测到任何

无论如何,必须修改程序的设计。由于这不是代码编写服务,我希望我的意见能够指出你的方向。