0

私は、Facebookのようなウィジェットのようなものを実装しようとしています:

You, Name1, Name2 and 20 other people like this

この HTML を表示できるようにすべてのデータを取得しましたが、HTML 文字列を形成するための適切なアルゴリズムが見つからないようです。

and私の主な問題は、文字列または,(カンマ) 文字列をいつ配置するかわからないことです。名前を付けるだけならうまくいきますが、問題はYou文字列が常に最初になければならないことです。

ここに自分のコードと、いくつかの特殊なケース (PHP の場合) で取得した出力を貼り付けます。

$current_user = 0;
$html = "";
$count = count($result);
$key = 0;
foreach($result as $liked){
    if($key + 1 > $limit)
        break;

    if($liked->uid == $user->uid){
        $current_user = 1;
        continue;
    }

    $html .= "<a href='".$liked->href."'>".$liked->name."</a>";

    if($key < $count - 2)
        $html .= ", ";
    elseif($key == $count - 2 && $key + 1 != $limit)
        $html .= " and ";

    $key++;
}

if($current_user){
    $userHtml = "You";

    if($count > 2)
        $userHtml .= ", ";
    elseif($count > 1)
        $userHtml .= " and ";

    $html = $userHtml.$html;
}

$html = "&hearts; by ".$html;

if($count > $limit){
    $difference = $count - $limit;
    $html .= " and ".$difference." ".format_plural($difference,"other","others");
}

return $html;

そして、現在のユーザーがこれを気に入った最後のユーザーであるという特別なケースでは、次のように表示されます。

♥ by You, admin, edu2004eu and

後ろにあるはずandだったので、単語の後に何もないことに注意してください。しかし、私はそれを最初に置きました。You何か助けはありますか?実際のコードではなく、ロジックだけが必要です。

4

2 に答える 2

3

あなたはこのようなことを試すことができます:

$likedBy = array('admin', 'eduard', 'jeremy', 'someoneelse');

// check if I like it and if so move me to the front
if (in_array($currentUsername, $likedBy)) {
  $me = array_search($currentUsername, $likedBy);
  unset($likedBy[$me]);
  array_unshift($likedBy, 'You');
}

// remove anything after the limit
$extra = array_splice($likedBy, 3);

// the comma list
$html = implode(', ', $likedBy);

// any extras? if so, add them here, if not rewrite the list so
// it's "You, Eduard and admin"
if (!empty($extra)) {
  $html .= ' and '.count($extra);
} else {
  $lastguy = array_splice($likedBy, 1);
  $html = implode(', ', $likedBy).' and '.$lastguy;
}

$html .= ' like this';
于 2012-05-23T15:25:30.947 に答える
1

Eduard、$key++;ループの一番上に置いて、ループ内にあるすべての場所を取り出すだけで、これを修正でき$key + 1ます.

何が起こっているか$key + 1は、現在のユーザーがいると仮定していると思います。

この行は、最初の $limit エントリ数に含まれていない場合、現在のユーザーも表示しません。

if($key + 1 > $limit)
    break;

現在のユーザーを検索するコードの後に​​これを配置することで、これを修正できます。

Java (私は知っていますが、それは私が実行していたものです) では、次のようになります。

    List<String> users = Arrays.asList("Brian","Tom","Jack","John");
    int key = 0;
    String html = "";
    String currentUser = "Brian";
    int limit = 3;
    boolean foundCurrentUser = false;
    for (String user : users) {
        key ++;
        if (currentUser == user) {
            foundCurrentUser = true;
            continue;
        }
        if (key > limit) {
            continue;
        }
        html += user;

        if (key < users.size() - 1) {
            html += ",";
        } else if (key == users.size() - 1 && key != limit) {
            html += " and ";
        }
    }
    if (foundCurrentUser) {
        String userHTML = "You";
        if (key > 2) {
            userHTML += ", ";
        } else if (key == 1) {
            userHTML += " and ";
        }
        html = userHTML + html;
    }

    html = "Likeed by " + html;
    if (users.size() > limit ) {
        html += " and 3 other people";
    }
    System.out.println(html);
于 2012-05-23T15:22:02.807 に答える