2015-05-29 108 views
-1

我想创建一个将从数组中生成的自定义toc(目录)。例如数组值看起来像这样:PHP数组定制循环

$angka = array(1,11,12,13,2,21,22,23); 

当值containts多于1位(11,12,13,21,22,23等)应该被分类为“子”。否则,应将其分类为“非子”。所需的输出应该是这样的https://jsfiddle.net/thekucays/azordcv5/2/

为了实现这一点,我循环数组,检查当前索引,以前的索引和下一个索引长度。的代码看起来是这样

<?php 
$angka = array(1,11,12,13,2,21,22,23); 
$hitung = count($angka);  
$keys = array_keys($angka); 

echo "<ul>"; 
foreach(array_keys($keys) as $k){ 
    if(strlen($angka[$keys[$k]])==1){ 
     echo "<li>ini bukan sub</li>"; 
    } 
    else if(strlen($angka[$keys[$k]])>1 && strlen($angka[$keys[$k-1]])==1){ //buka sub baru 
     echo "<li><ul>"; 
     echo "<li>ini buka sub</li>"; 
    } 
    else if(strlen($angka[$keys[$k]])>1 && strlen($angka[$keys[$k-1]])>1 && strlen($angka[$keys[$k+1]])>1){ //ini masih di dalem sub 
     echo "<li>ini sub tengah</li>"; 
    } 
    else if(strlen($angka[$keys[$k]])>1 && strlen($angka[$keys[$k-1]])>1 && ($k<=$hitung || strlen($angka[$keys[$k+1]])==1)){ //akhir sub, tutup 
     echo "<li>ini sub akhir</li>"; 
     echo "</ul></li>"; 
    } 
} 
echo "</ul>"; 

?>

问题,在示例代码,foreach循环将继续循环,直到阵列长度1(其为8),并且将显示“未定义抵消”通知。我怎么能阻止呢?

+0

当你正在做'$ ankga'的'array_keys'时,你实际上变得'0,1..6,7'。你正在寻找'array_values'。 – Andrew

+0

'$ angka [$ keys [$ k + 1]]'是非常令人费解的,因为你可以刚刚做完foreach($ angka as $ k => $ v)''但你需要的是检查'isset($ Angka [$ keys [$ k + 1]])''在尝试使用它之前。 – AbraCadaver

+0

@AbraCadaver我试图使用isset,但它仍然显示相同的通知...这对我来说非常混乱,因为isset适用于我另一个非常非常简单的情况:( – thekucays

回答

0

嗨假设你的数组将始终具有相同的模式(主要子后,有一个未来三年潜艇) 可以简化这样

<?php 
    $angka = array(1,11,12,13,2,21,22,23); 

    echo "<ul>"; 
    $counter = 0; 
    foreach($angka as $value){ 
     $quotient = $value/10; 

     if ($quotient == 0) { // Meaning not - sub 
      echo "<li>ini bukan sub</li>"; 
      $counter = 0; // reset sub - index 
     } 
     else { // Display subs 
      switch ($counter) { //Select what sub type to be displayed 
       case 0: // first sub 
        echo "<li><ul>"; 
        echo "<li>ini buka sub</li>"; 
        break; 
       case 1: //second sub 
        echo "<li>ini sub tengah</li>"; 
       case 2: //third sub 
        echo "<li>ini sub akhir</li>"; 
        echo "</ul></li>"; 
      } 
      $counter++; 
     } 
    } 
echo "</ul>"; 

在这种情况下,你的代码,你可以摆脱您现在遇到的索引问题。

+0

不幸的是,模式并不总是这样,所以还有另外一个选择吗?:) – thekucays

+0

然后编辑你的文章 – Sherlock