0

(誰かが尋ねる前に... このプロジェクトに MySQL データベースを使用することはできません。)

PHP を使用して、ネストされた UL をフラットファイル データベースから作成する必要があります。私が抱えている問題は、重複したアイテムを表示したくないということです。もっと詳しく説明することもできますが、以下のコードを見ると、データとゴールがわかります。ありがとう。

フラットファイルデータ:

セクション|カテゴリ|サービス
セクション 1|カテゴリー 1|
セクション 1|カテゴリー 2|SC1
セクション 1|カテゴリ 2|SC2
セクション 1|カテゴリー 2|SC3
セクション 1|カテゴリ 2|SC4
セクション1|カテゴリー3|
セクション 2|カテゴリー 4|SC5
セクション 2|カテゴリー 4|SC6
セクション 3|カテゴリー 5|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);
?>
4

2 に答える 2

0

このソリューションの功績は認められません。別のサイトで「専門家」から回答がありました。ただし、このトピックは、この「スタック」サイトにこのソリューションを再投稿するのに十分重要であると本当に感じています.

解決:

<?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;
}
?>
于 2013-05-28T09:05:48.693 に答える
0

ネストされた配列をservice使用し、PHP のin_array関数を使用してアイテムが存在するかどうかを確認することをお勧めします。

たとえば、1 行分のデータを追加するには、まずサービスが存在するかどうかを確認してから追加します。

$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;
}
于 2013-05-27T17:28:30.960 に答える