in_array有类似的功能吗?

时间:2012-10-19 20:31:02

标签: php

我有一组人在html文件中注册为在线。我正在使用它,以便每个人都可以分配一个图像。但是在检查是否已使用名称时,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不同。无论如何检查数组中是否存在该名称?在回复时请解释。

1 个答案:

答案 0 :(得分:4)

而不是问“我如何解决这个问题?”,你需要先说“为什么我遇到这个问题?”

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

< img src='default.jpg' />John是用户名吗?你为什么用它呢?我猜这背后有一些聪明的想法,“好吧,我总是用他们的名字显示用户的图像,所以我只是使图像成为他们名字的一部分这是导致问题远远超过它解决的问题。这又回到了计算机科学中一个名为separation of concerns的大概念。图像不是逻辑上用户名的一部分,所以不要将其存储为。如果您始终将它们一起显示,则可以使用函数以标准方式显示用户的信息,而不会将图像作为用户名的一部分。

首先,从名称中删除图像。有几种方法可以单独存储它。

我建议使用a class

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();

如果你想变得更懒,你可以使用"array",但我不建议在一般情况下使用它,因为你失去了类的酷功能(比如那些功能):

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

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

在您的数据库中(如果您正在使用),请将它们分开,然后使用上述数据结构之一。

现在您已经拥有了这个,使用foreach loop很容易看出用户名是否在给定列表中:

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了..