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

3wabscal  于 2023-01-16  发布在  PHP
关注(0)|答案(4)|浏览(148)

我有一个数组,看起来像这样:

$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);
rm5edbpk

rm5edbpk1#

我觉得你想要的是array_merge而不是array_push
http://php.net/manual/en/function.array-merge.php

aoyhnmkz

aoyhnmkz2#

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()
);
toe95027

toe950273#

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

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

jc3wubiy4#

你的逻辑中有一个错误,请看下面的代码片段:

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

回想一下,array_key_exists()documented定义如下:

bool array_key_exists (mixed $key, array $search)

因此,你试图使用的“一个数组 * 键”* 本身就是一个数组,你不能这么做。(但是,PHP可能不会告诉你这一点。它可能只是做了错误的事情。)
你必须包含一个 loop 来搜索数组,将每个元素与$date_title进行深度比较,以确定它是否已经存在,或者,你可能希望使用 another 数组,比如由title索引的数组,来快速确定某个特定的标题之前是否已经被提到过。
进一步扩展上述概念,您可以通过titlepermalink的“连接”来索引“另一个数组”,以便快速检测到这两个值的任何“组合”以前出现过。
在任何情况下,修改程序的设计都是必要的。

相关问题