检查数组中是否有某些内容会返回错误

时间:2015-01-21 16:57:11

标签: php arrays

我有一个数组,我生成一个可能存在于数组中的随机数,我试图看看随机数是否在数组中。如果它存在于数组中,它将为用户提供某个项目,如果它不在数组中,我希望它什么都不做。我在一个演示页面上写了全部来测试它,当随机#不在数组中时,我不断收到错误。我是否正确检查#是否在阵列中?我不能为我的生活弄明白。

如果您需要更多信息,请告诉我。

错误:

Notice: Undefined offset: 10 in C:\xampp1\htdocs\hvp\battlemasters\play\text.php on line 17

代码:

$items_list = array();
$enemy_items = "1|7|8|10|11";

// Split Items
$enemy_item = explode("|",$enemy_items);
foreach($enemy_item as $item){
    array_push($items_list,$item);
}

// Get Total # Of Items In Array
$count = count($items_list);

// Start Random # Drawing
$start = 1;
$end = $count*2;
$random = rand($start,$end); 

// Check If $random Exists In Array
if (in_array($items_list[$random],$items_list) == TRUE) {
    // Item Exists So Lets Give The Item To The User

}

修改 现在为$ enemy_items = $ r1 ['items']我刚刚在数据库中添加了一个项目供敌人测试,项目#是7

$q1 = 'SELECT * FROM `enemies` WHERE `id`="'.$enemy_id.'"';
$rq1 = mysql_query($q1);
$r1 = mysql_fetch_array($rq1);
$enemy_items = $r1['items'];

$items_list = array();

// Split Items
$items_list = explode("|",$enemy_items);

// Get Total # Of Items In Array
$count = count($items_list);

// Start Random # Drawing
$start = 1;
$end = $count*2;
$random = rand($start,$end); 

// Check If $random Exists In Array
if (in_array($random,$items_list)) {
    // Check if character already has the item in inventory
    $query = 'SELECT * FROM `characters` WHERE `user_id`="'.$_SESSION['user'].'" AND `iid`="'.$random.'" AND `cat`="items"';
    $r_query = mysql_query($query);
    $result = mysql_fetch_array($r_query);
    $exists = mysql_num_rows($r_query);
    if($exists == 1) {
        $quantity = $result['quantity'];
        // Update Characters Inventory
        $query = "UPDATE `characters_inventory` SET `quantity`='".$quantity++."' WHERE `user_id`='".$_SESSION['user']."' AND `iid`='".$random."' AND `cat`='items'";
        mysql_query($query);
    }else{
        // Insert New Item
        $query = "INSERT INTO `characters_inventory` (`user_id`,`iid`,`cat`,`quantity`) VALUES ('".$_SESSION['user']."','".$random."','items','1')";
        mysql_query($query);
    }

}

MySQL Stuff:

CREATE TABLE IF NOT EXISTS `enemies` (
`id` int(255) NOT NULL,
`name` varchar(255) NOT NULL,
`type` varchar(255) NOT NULL,
`icon` varchar(255) NOT NULL,
`items` varchar(255) NOT NULL
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=94 ;

INSERT INTO `enemies` (`id`, `name`, `type`, `icon`, `items`) VALUES (1, 'Dragon', 'Dragon', 'images/enemies/Dragon_1_1.png', '7');

3 个答案:

答案 0 :(得分:2)

这很简单:

if (in_array($random, $items_list))

答案 1 :(得分:2)

$items_list = array();
$enemy_items = "1|7|8|10|11";

// Split Items
$items_list = explode("|",$enemy_items);

// Get Total # Of Items In Array
$count = count($items_list);

// Start Random # Drawing
$start = 1;
$end = $count*2;
$random = rand($start,$end); 

// Check If $random Exists In Array
if (in_array($random,$items_list)) {
    // Item Exists So Lets Give The Item To The User
  echo "it exists.";
}

如果你想检查$ items_list数组中是否存在$random,只需检查$ random是否存在,不要检查随机索引是否存在。

此外,此处不需要foreach,explode已经返回一个数组,因此您的字符串"1|7|8|10|11"将自动转换为数组。

编辑:

要澄清:

通过检查$ items_list [$ random]是否存在,您实际上是在询问数组:

"密钥$ random是否存在于数组中?",最终可能是真的,因为数组是[1,7,8,10,11],但实际上真的就是这样:

array(
0 => 1,
1 => 7,
2 => 8,
3 => 10,
4 => 11
);

因此,如果$ random由于某些原因3,if将评估为TRUE,尽管数组中的没有值为3 ,但是有一个是3。

小心。

编辑2:

修复不需要的== TRUE。

编辑3:

走得更远::

既然你看起来很困惑,我会给你一个关于会发生什么的简短例子。

情景1:

in_array($items_list[$random], $items_list)

假设数组是上面那个:

array(
0 => 1,
1 => 7,
2 => 8,
3 => 10,
4 => 11
);

有两种情况:

答:$random要么是0 [不可能],要么是1,2,3,4。

B:$random是任何其他号码。

案例A:

如果$ random是2,则if将继续这样:

首先,它将检查KEY 2是否已设置,因此,您的if可以解释为:

if (in_array($items_list[2], $items_list))

但是,由于密钥2存在,它实际上对应于:

in_array(8, $items_list)

因为$ items_list数组的 KEY 2存在且值为8(请检查上面的数组)。

此时,if就像:"那么,$ items_list数组中是否有任何值为8?"答案是正确的,因此,if将评估 DESAPITE THAN ISN&n。真正具有任何价值的东西

案例B:

我们假设$ random是10(无论如何都是最大值)。

PHP将尝试像以前一样找到相应键的值,但是,也可以通过这种方式看到数组:

array(
0 => 1,
1 => 7,
2 => 8,
3 => 10,
4 => 11,
5 => null,
[...]
10 => null
);

所以,由于密钥10没有值,php会告诉你一个通知,告诉你"嘿先生,密钥10没有价值,因为它没有设置。",也知道as:undefined offset: 10

情景2:

in_array($random, $items_list)

在这种情况下,$ random可以在此Universe中具有任何值,in_array将始终返回true或false,因为它只会检查数组中是否存在VALUE。 (你可以在帖子的最开头找到关于这一点的进一步解释)。

希望这会有所帮助。

答案 2 :(得分:1)

修改上次条件:

// Check If $random Exists In Array
if (isset($items_list[$random])) {
    // Item Exists So Lets Give The Item To The User

}