2016-08-04 45 views
0

我有一個數組,看起來像這樣:如何在使用array_push()時控制數組鍵?

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

回答

-1

您只需在您的邏輯錯誤。考慮此摘錄你的代碼:

$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可能不會告訴你,它可能只是做了錯誤的事情。)

你將不得不包括循環通過您的陣列搜索,深比較反對$date_title每個元素確定它是否已經存在。或者,您可能希望使用另一個數組(如title索引),以快速確定以前是否提及特定標題。

擴展上面的概念更進一步,你可以索引,爲了「另一個陣列」並舉titlepermalink串聯快速檢測任何兩個值的組合曾經出現過。

在任何情況下,您的程序設計的修改是必要的。由於這不是代碼寫作服務,所以我希望我的意見能夠指出您的方向。

+0

你當然**可以**「做那個」,因爲在使用一個*數組* *作爲*鍵*到'array_key_exists',這正是* mixed *關鍵字的含義。然而,這可能不是他*想要的*。 – alzee

+0

我不知道在這種情況下數組可以工作。 (而且,我當然不會*做*它。) –

+0

實際上它不,我錯過了。我認爲它在這裏工作,但它實際上只意味着* string *或* int *在這種情況下。 – alzee

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

這樣你可以檢查項存在,並將其推到數組:

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