0

私は次のようなコードを書こうとしています:

  1. 人のリストを含む文字列 を$currentAuthors配列に変換し、$authors各人がその配列の値になります。
  2. その配列の各人物を別の配列の各人物と比較し、それらが一致する場合は、値を and でラップします( $authors例として)。<a href="#"></a>
  3. この配列から別の文字列を作成します。コンマ"、"" および "区切り文字を使用して、文字列が読みやすくなるようにします。

基本的に、特定の人の名前をリンクにします。

コードはここにあり、これは機能します:

$currentAuthors = "Paul Peters,  Joe Bloggs,  Chloe Brown, Sarah Smith, Anna Smith and Mark Jones";

$linkableAuthors = array("Joe Bloggs","Anna Smith");

echo "Initial string: ".$currentAuthors."<br />";
// replace all instances of "and" with "," so all authors in $newAauthors are separated by a comma
$replaceAnds = str_replace(" and ", ",", $currentAuthors);
//create array from $currentAuthors, using comma as delimiter
$authors = explode(",", $replaceAnds );
$authorsCount = count($authors);
foreach ($authors as $key=>&$author) {
    // Trim spaces from beginning and end of each author, if there are any
    $author = trim($author);
    foreach ($linkableAuthors as $linkableAuthor) {
        // check if each value in $authors matches any of the $linkableAuthors, if so, make it a link.
        if ($author == $linkableAuthor) {
            $author = "<a href='#'>".$author."</a>";
        }
    }

}

$fullAuthorList = "";

// logic for recreating initial string with new links added in; creating separators
foreach ($authors as $key=>$authorFinal) {
    $fullAuthorList .= $authorFinal;

    if ($authorsCount==1) {
        // do nothing, only one author
    }
    elseif ($key==$authorsCount-1) {
        // do nothing, on last author
    }
    elseif ($key==$authorsCount-2) {
        $fullAuthorList .= " and ";
    }
    else {
        $fullAuthorList .= ", ";
    }

}

$fullAuthorList .= "</p>";

echo "Final string: ".$fullAuthorList;

結果は次のとおりです。


最初のストリング: ポール・ピーターズ、ジョー・ブロッグス、クロエ・ブラウン、サラ・スミス、アンナ・スミス、マーク・ジョーンズ

最後のストリング: ポール・ピーターズ、ジョー・ブロッグス、クロエ・ブラウン、サラ・スミス、アンナ・スミス、マーク・ジョーンズ


ただし、このコードを関数にすると、Joe Bloggs と Anna Smith へのリンクが追加されなくなります。理由はありますか?値$authorsが適切に変更されていないのは何かに違いありません。

ここでコードが機能しない:

$currentAuthors = "Paul Peters,  Joe Bloggs,  Chloe Brown, Sarah Smith, Anna Smith and Mark Jones";

$linkableAuthors = array("Joe Bloggs","Anna Smith");

function getAuthors ($input) {
    echo "Initial string: ".$input."<br />";
    // replace all instances of "and" with "," so all authors in $newAauthors are separated by a comma
    $replaceAnds = str_replace(" and ", ",", $input);
    //create array from $currentAuthors, using comma as delimiter
    $authors = explode(",", $replaceAnds );
    $authorsCount = count($authors);
    foreach ($authors as $key=>&$author) {
        // Trim spaces from beginning and end of each author, if there are any
        $author = trim($author);
        foreach ($linkableAuthors as $linkableAuthor) {
        // check if each value in $authors matches any of the $linkableAuthors, if so, make it a link.
            if ($author == $linkableAuthor) {
                $author = "<a href='#'>".$author."</a>";
            }
        }

    }

    $fullAuthorList = "";

    // logic for recreating initial string with new links added in; creating separators
    foreach ($authors as $key=>$authorFinal) {
    $fullAuthorList .= $authorFinal;

    if ($authorsCount==1) {
        // do nothing, only one author
    }
    elseif ($key==$authorsCount-1) {
        // do nothing, on last author
    }
    elseif ($key==$authorsCount-2) {
        $fullAuthorList .= " and ";
    }
    else {
        $fullAuthorList .= ", ";
    }

    }

    $fullAuthorList .= "</p>";

    echo "Final string: ".$fullAuthorList;

}

getAuthors($currentAuthors);

今回はリンクを追加せずに結果を表示します。


最初のストリング: ポール・ピーターズ、ジョー・ブロッグス、クロエ・ブラウン、サラ・スミス、アンナ・スミス、マーク・ジョーンズ

最後のストリング: ポール・ピーターズ、ジョー・ブロッグス、クロエ・ブラウン、サラ・スミス、アンナ・スミス、マーク・ジョーンズ


どうもありがとう!私はPHPを学ぶのが初めてです。

4

1 に答える 1

1

$linkableAuthors変数が関数で使用できないために発生しています。関数内でグローバルとして宣言する必要があります。言い換えると:

function getAuthors ($input) {

    global $linkableAuthors;

    echo "Initial string: ".$input."<br />";

[...]

変数のスコープの詳細については、マニュアルを参照してください。

于 2013-11-09T17:39:57.833 に答える