2
function test($str) {
  $c = count($str);
  if ($c>1) {
    foreach ($str as $key => $value) $result .= test($value);
  } else {
    $result = "<li>$str</li>\n";
  }
  echo $result ? "<ol>$result</ol>" : null;
}

$ strの値は、次のいずれかになります。

$str1 = "apple";

またはそのようなもの;

$str2 = array("apple","orange","pear");

count($ str)が複数の場合、つまり$ strがis_arrayの場合、$resultを繰り返します。
しかし、希望どおりに機能しません。「test()を再宣言できません(以前は...で宣言されていました)」
というエラーが表示されます。

理想的な出力は次のようになります-$str1;

<ol>
  <li>apple</li>
</ol>

理想的な出力は次のようになります-$str2;

<ol>
  <li>apple</li>
  <li>orange</li>
  <li>pear</li>
</ol>
4

3 に答える 3

3
function test($str) {

  // Ensure, $str is a good argument of implode()
  if ( ! is_array( $str )) {
    $str = array( $str );
  }

  $result = '<li>' . implode( '</li><li>', $str ) . '</li>';

  return '<ol>' . $result . '</ol>';

}

備考:あなたのメソッドはこれを返すことができます:

<ol>
  <li>1</li>
  <li>
  <ol>
    <li>1</li>
    <li>2</li>
    <li>3</li>
  </ol>
  </li>
  <li>3</li>
</ol>

これは本当にあなたが達成したいことですか?OL本当にネストされた構造を作成する必要がありますか?

于 2012-07-22T14:09:39.743 に答える
1

$str が配列であるかどうかを確認します。例:

function test($str, $first=true) {
  if (!is_array($str)) {
    $result = "<li>$str</li>\n";
  } else {
    foreach ($str as $key => $value) $result .= test($value, false);
  }
  return ($first ? "<ol>$result</ol>" : $result);
}

この例も参照してください。

===更新===

直接印刷する場合は、次のように置き換えます。

function test($str, $first=true) {
  if (!is_array($str)) $result = "<li>$str</li>";
  else foreach ($str as $key => $value) $result .= test($value, false);
  if ($first) echo "<ol>$result</ol>";
  else return $result;
}

この例も参照してください。

于 2012-07-22T13:30:30.777 に答える
1
function testInternal($str){
    if(is_array($str))
        return implode('',array_map('testInternal', $str));
    else
        return '<li>'.$str.'</li>';
}
function test($str){
    echo '<ol>'.testInternal($str).'</ol>';
}
于 2012-07-22T13:33:55.390 に答える