-1

HTMLファイルにオンラインとして登録されている人々の配列があります。これを使用して、それぞれに画像を割り当てることができます。しかし、using name が既に使用されているかどうかを確認するとき、in_array 関数は false を返し、スクリプトを続行できるようにします。

$user = "< img src='default.jpg' />John";
$explode = array("<img src='tress.jpg' />John");

if(in_array($user, $explode))
   {
   //show login script if user exists
   }
   else
    {
     //continue to script
     }

これが機能しない理由は、配列内の john が $user 内の john と同一ではないためです。名前が配列に存在することを確認する方法はありますか? 返信するときは、説明してください。

4

1 に答える 1

4

「この問題を解決するにはどうすればよいですか?」と尋ねる代わりに、「なぜこの問題が発生するのか?」から始める必要があります。

$user = "< img src='default.jpg' />John";

< img src='default.jpg' />Johnユーザー名ですか?なぜそれを1つとして使用するのですか?この背後には、次のような巧妙な考えがあると推測してます関心の分離と呼ばれるコンピュータ サイエンスの大きな概念に戻ります. 画像は論理的にはユーザー名の一部ではないため, 1 つの画像として保存しないでください. 常に一緒に表示する場合は, 関数を使用してユーザー名を表示できます.画像をユーザー名の一部にすることなく、標準的な方法で情報を取得します。

まず、名前から画像を削除します。これを別々に保管する方法はいくつかあります。

クラスを使用することをお勧めします:

class User {
    public $name;
    public $imageSource;

    // The following functions are optional, but show how a class
    // can be useful.

    /**
     * Create a user with the given name and URL to their image
     */
    function __construct($name, $imageSource) {
        $this->name = $name;
        $this->imageSource = $imageSource;
    }

    /**
     * Gets the HTML to display a user's image
     */
    function image() {
        return "<img src='". $this->imageSource ."' />";
    }

    /**
     * Gets HTML to display to identify a user (including image)
     */
    function display() {
        return $this->image() . $this->name;
    }
}

$user = new User("john", "default.jpg");

// or without the constructor defined
//$user = new User();
//$user->name = "john";
//$user->imageSource = "default.jpg";

echo $user->display();

少し怠惰になりたい場合は「配列」を使用できますが、クラスの優れた機能(これらの関数など)が失われるため、一般的なケースではお勧めしません。

$user = array(
   name => "john",
   image => "<img src='default.jpg' />";
);

echo $user["image"] . $user["name"];

データベース(使用している場合)で、それらを別々の列にしてから、上記のデータ構造のいずれかを使用します。

これで、ユーザー名がforeach ループを使用して特定のリストにあるかどうかを簡単に確認できます。

function userNameInList($user, $users) {
    for($users as $current) {
        if($user->name == $current) {
            return true;
        } 
    }
    return false;
}

$newUser = new User("John", "john.jpg");
$currentUsers = array("John", "Mary", "Bob");
if(userNameInList($newUser, $currentUsers) {
    echo "Sorry, user name " . $newUser->name . " is already in use!";
}

PHP を初めて使用する場合は、通常のforループの方が理解しやすいかもしれません。

function userNameInList($user, $users) {
    for($i = 0; $i < count($users); ++i) {
        $current = $users[$i];
        if($user->name == $current) {
            return true;
        } 
    }
    return false;
}

これのいずれかが実行されない場合はお知らせください。私はもうあまり頻繁に PHP を書いていません..

于 2012-10-19T20:52:55.510 に答える