PHP数组自定义循环

PHP数组自定义循环,php,arrays,Php,Arrays,我想创建一个从数组生成的自定义toc(目录)。例如,数组值如下所示: $angka = array(1,11,12,13,2,21,22,23); 当值包含超过1位数字(11、12、13、21、22、23等)时,应将其归类为“子”。否则,应将其归类为“非子类”。期望的输出应该是这样的 为了实现这一点,我循环数组,检查当前索引、上一个索引以及下一个索引长度。代码如下所示 <?php $angka = array(1,11,12,13,2,21,22,23); $hitung = count

我想创建一个从数组生成的自定义toc(目录)。例如,数组值如下所示:

$angka = array(1,11,12,13,2,21,22,23);
当值包含超过1位数字(11、12、13、21、22、23等)时,应将其归类为“子”。否则,应将其归类为“非子类”。期望的输出应该是这样的

为了实现这一点,我循环数组,检查当前索引、上一个索引以及下一个索引长度。代码如下所示

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


问题是,在示例代码中,foreach循环将继续循环,直到数组长度+1(即8),并将显示“未定义偏移”通知。我怎样才能避免呢

Hi假设您的阵列始终具有相同的模式(在主sub之后,还有接下来的三个sub) 您可以像这样简化代码

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

当你对
$ankga
执行
数组\u键时,你实际上得到了
0,1..6,7
。你正在寻找
array\u值
$angka[$keys[$k+1]]
非常复杂,因为你可以用
foreach($angka as$k=>$v)
,但你需要的是在尝试使用它之前检查
isset($angka[$keys[$k+1]])
。@Abracadver我试图使用isset,但它仍然显示出相同的提示。这对我来说非常困惑,因为isset适用于我的另一个非常简单的情况:(不幸的是,模式并不总是这样,所以还有其他选择吗?:)