0

重複の可能性:
配列を「,」で分解し、最後の項目の前に「and」を追加

WordPress テーマをカスタマイズしており、管理者のユーザー プロファイル ページにいくつかのチェックボックスを作成しました。正確には 3 つです。ユーザーが各ボックスをチェックすると、プロファイルを保存するときに、そのボックスの値が配列 calle $goals に保存されます。これはすべてうまくいきます。

テンプレートページで、ユーザーが選択した目標に基づいて特定のコンテンツを表示する方法についていくつかのテストを行っているため、配列に各値が含まれているかどうか、次に目標の組み合わせが含まれているかどうかを確認する次のコードを作成しました。それらの選択に基づいて特定のコンテンツをエコーし​​ます。それは問題なく動作しますが、コードが肥大化し、合理化できると感じています。これは、私が常に自分のコードでやろうとしていることです。より少ないコードで同じ結果を得る方法について、ご意見をお寄せいただければ幸いです。ありがとう。

$goals = get_user_meta( $userID, 'goals', $single );

if (in_array('Weight Loss', $goals, true) && !in_array('Improve Fitness', $goals, true) && !in_array('Improve Health', $goals, true)) {
    echo 'Weight Loss';
} elseif (in_array('Improve Fitness', $goals, true) && !in_array('Weight Loss', $goals, true) && !in_array('Improve Health', $goals, true)) {
    echo 'Improve Fitness';
} elseif (in_array('Improve Health', $goals, true) && !in_array('Improve Fitness', $goals, true) && !in_array('Weight Loss', $goals, true)) {
    echo 'Improve Health';
} elseif (in_array('Weight Loss', $goals, true) && in_array('Improve Fitness', $goals, true) && !in_array('Improve Health', $goals, true)) {
    echo 'Weight Loss and Improve Fitness';
} elseif (in_array('Weight Loss', $goals, true) && !in_array('Improve Fitness', $goals, true) && in_array('Improve Health', $goals, true)) {
    echo 'Weight Loss and Improve Health';
} elseif (!in_array('Weight Loss', $goals, true) && in_array('Improve Fitness', $goals, true) && in_array('Improve Health', $goals, true)) {
    echo 'Improve Fitness and Improve Health';
} elseif (in_array('Weight Loss', $goals, true) && in_array('Improve Fitness', $goals, true) && in_array('Improve Health', $goals, true)) {
    echo 'Weight Loss, Improve Fitness and Improve Health';
} else {
    echo 'Nothing set';
}
4

2 に答える 2

2

人間が読める形式で目標のリストを表すには:

if (count($goals) > 1) {
    echo join(', ', array_slice($goals, 0, -1)) . ' and ' . end($goals);
} elseif ($goals) {
    echo $goals[0];
} else {
    echo "Nothing set";
}

アイテムの数に応じて、コードは"X"/ "X and Y"/のいずれかを返します"X, Y and Z"

複数の項目がある場合は、次のようになります。

  1. 最後の項目を含まない項目までを - using を使用array_slice()して、それらの間にコンマを入れます - using を使用しjoin()ます。
  2. 単語" and "と最後の項目の値を追加します。

$goalsあなたが言及したアイテムだけに配列を絞り込むには:

$goals = array_intersect(array('Weight Loss', 'Improve Fitness', 'Improve Health'), $goals);

関心のあるものを除くすべての値を取り除きます。あなたの場合はそのうちの 3 つだけです。ただし、状況によっては、このコードが必要ない場合があります。

于 2012-10-03T08:42:58.033 に答える
0

例が示すように単純に文字列を連結したくない場合は、そのコードのより合理化されたバージョンは次のようになります。

sort($goals);

switch ($goals) {
    case array('Weight Loss') :
        ...
        break;

    case array('Improve Fitness', 'Weight Loss') :
        ...
        break;

    ...
}

ここで重要なことは、両方の配列の要素が同じ順序であるため、初期sort要素と比較要素がアルファベット順に並べられていることです。

そうは言っても、可能なすべての順列を処理するよりも、これを処理するより良い方法が必要です。これは、オプションを追加すると指数関数的に増加するためです。通常、目標のコレクションをループして、各目標に対して何かを実行してから、集計値を出力する必要があります。

$output = array();

foreach ($goals as $goal) {
    switch ($goal) {
        case 'Weight Loss' :
            $output[] = 'I want to lose weight.';
            break;

        case 'Improve Fitness' :
            $output[] = ...
            break;

        ...
    }
}

echo join("\n", $output);

各ゴールが個々のオブジェクトとして定義される、非常に賢明な OOP ベースの構造では、これはさらに次のようになります。

$output = array();

foreach ($goals as $goal) {
    $output[] = $goal->objectiveDescription();
}

echo join("\n", $output);

つまり、問題への取り組み方が不十分です。とはいえ、実際に何をしようとしているのかを知らずに何かを提案するのは難しいです。

于 2012-10-04T01:56:16.923 に答える