PHP数组自定义循环
我想创建一个从数组生成的自定义toc(目录)。例如,数组值如下所示: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
$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适用于我的另一个非常简单的情况:(不幸的是,模式并不总是这样,所以还有其他选择吗?:)