PHP数组自定义循环


PHP array custom looping

我想创建一个自定义toc(目录表),将从数组生成。例如,数组值看起来像这样:

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

包含超过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),并将显示"未定义的偏移量"通知。我怎样才能避免呢?

假设你的数组将始终具有相同的模式(在main sub之后,有接下来的三个sub)您可以像这样简化代码

 <?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>";

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