(在有人问之前......我不能在这个项目中使用MySQL数据库。)
使用PHP,我需要从flatfile数据库创建嵌套的UL。我遇到的问题是我不希望显示重复的项目。我可以进一步解释,但是如果你看看下面的代码,你会看到数据和目标。谢谢。
平面数据:
section|category|service Section One|Category One| Section One|Category Two|SC1 Section One|Category Two|SC2 Section One|Category Two|SC3 Section One|Category Two|SC4 Section One|Category Three| Section Two|Category Four|SC5 Section Two|Category Four|SC6 Section Three|Category Five|SC7
HTML目标输出
<ul class="section">
<li>Section One
<ul class="category">
<li>Category One</li>
<!-- no service -->
</ul> <!-- /category -->
<ul class="category">
<li>Category Two</li>
<ul class="service">
<li>SC1</li>
<li>SC2</li>
<li>SC3</li>
<li>SC4</li>
</ul> <!-- /service -->
</li>
</ul> <!-- /category -->
<ul class="category">
<li>Category Three</li>
<!-- no service -->
</ul> <!-- /category -->
</li>
</ul> <!-- /section -->
<ul class="section">
<li>Section Two
<ul class="category">
<li>Category Four</li>
<ul class="service">
<li>SC5</li>
<li>SC6</li>
</ul> <!-- /service -->
</li>
</ul> <!-- /category -->
</li>
</ul> <!-- /section -->
<ul class="section">
<li>Section Three
<ul class="category">
<li>Category Five</li>
<ul class="service">
<li>SC7</li>
</ul> <!-- /service -->
</li>
</ul> <!-- /category -->
</li>
</ul> <!-- /section -->
我的第一次尝试......认为我需要首先检查“部分”是否存在,然后将当前“部分”分配给“section_last”,以将下一个“部分”与当前“部分”值进行比较。 ..如果没有,打印“部分”......然后打印到类别上。 我没有对“服务”价值部分进行编码,因为我对该部分没有任何成功。类别值。似乎我遇到了这个背后的'逻辑'的问题,或者可能有一种方法可以将循环中的过去值与PHP提供的下一个值进行比较。
在看到来自@Kyle S的示例代码之后,我可能在完全错误的路径上进行编码。
<?php
$section = '';
$category = '';
$service = '';
$section_last = '';
$category_last = '';
$service_last = '';
$x = 0;
$file = fopen("categories_data.txt", "r");
if (!$file) { echo 'ERROR: Unable to open file: <strong>'.$file.'</strong>'; }
fgets($file); // IGNORE FIRST LINE IN FLATFILE - column names
while (!feof($file) ) {
$lines = fgets($file);
$ele = explode('|', $lines);
$section = $ele[0];
$category = $ele[1];
$service = $ele[2];
$service = str_replace(array("\n", "\r", "\r\n", "\n\r"), '',$service);
if(strlen($section)>0) {
if(!($section == $section_last)) {
echo '
<ul>
<li>'.$section;
$section_last = $section;
$x++;
}
}
echo '
<ul><li>'.$category.' > '.$service.'</li></ul>
';
if($x) {
if($section != $section_last) {
echo '
</li>
</ul>
';
}
}
} // end $data_file WHILE
fclose($file);
?>
答案 0 :(得分:0)
我建议使用嵌套数组并使用PHP的service
函数检查in_array
项是否存在。
例如,要添加单行的数据,请先检查服务是否存在:
$data = explode("|", $line);
$section = $data[0];
$category = $data[1];
$service = $data[2];
if ( !array_key_exists($section, $tree) ) {
$tree[$section] = array();
}
if ( !array_key_exists($category, $tree[$section]) ) {
$tree[$section][$category] = array();
}
if ( !in_array($service, $tree[$section][$category]) ) {
$tree[$section][$category][] = $service;
}
答案 1 :(得分:0)
我不能赞成这个解决方案。我被另一个网站的专家回答。但是,我真的觉得这个主题非常重要,可以在这个“堆栈”网站上重新发布这个解决方案。
<强> SOLUTION:强>
<?php
define('TAB', "\t");
define('TAB2', "\t\t");
// Open the input file
$file = fopen('lines.csv', 'rt');
// ignore the first line
fgets($file);
// Get the next line into an array splitting on the pipe
$line = fgetcsv($file, 255, '|');
// set the initial section value
$section = $line[0];
// Initialise batch array
$current = array();
// Loop through all lines in the file
do {
// If this line contains a section that is not the same as the previous line then dump the last section
if ($section != $line[0]) {
dump_categories($current, $section);
// Set our section flag to the next section
$section = $line[0];
// Clear the array of batched items to dump
$current = array();
}
// Add the line to the batch
$current[] = $line;
} while($line = fgetcsv($file, 255, '|'));
// Remember to dump batch that has built up
dump_categories($current, $section);
fclose($file);
function dump_categories(& $lines, $section)
{
// Set our category flag
$category = $lines[0][1];
// initialise batch array
$current = array();
// Start a new seection
echo '<ul class="section">' . PHP_EOL;
echo TAB . '<li>' . $section . PHP_EOL;
// If there are categories in this section then process them - don't want empty bullets here
if (!empty($lines[0][1])) {
foreach($lines as $l) {
// if this is a new category then dump category and services for this category
if ($category != $l[1]) {
dump_services($current, $category);
// set our category flag
$category = $l[1];
// ... and clear the batch array
$current = array();
}
// add to batch
$current[] = $l;
}
// and dump batched lines
dump_services($current, $category);
}
echo TAB . '</li>' . PHP_EOL;
echo '</ul>';
}
// Services we assume is the end of the line so output the service if it exists.
function dump_services(& $lines, $category)
{
echo TAB2 . '<ul class="category">' . PHP_EOL;
echo TAB . TAB2 . '<li>' . $category . PHP_EOL;
if (!empty($lines[0][2])) {
echo TAB2 . TAB2 . '<ul class="service">' . PHP_EOL;
foreach($lines as $l) {
if (!empty($l)) {
echo TAB . TAB2 . TAB2 . '<li>' . $l[2] . '</li>' . PHP_EOL;
}
}
echo TAB2 . TAB2 . '</ul>' . PHP_EOL;
}
echo TAB . TAB2 . '</li>' . PHP_EOL;
echo TAB2 . '</ul>' . PHP_EOL;
}
?>