PHP in_array函数保持匹配一个不存在的值


PHP in_array Function keeps matching a value that does not exist

下面我有一些PHP代码
-在用户阵列上迭代
-生成所有用户的HTML选择列表
-如果$subscriberIdFromDb数组中的用户存在于所有用户的数组中,则它会向HTML Selection元素添加一个selected属性
-如果满足上述条件,它还会添加一个具有用户ID的"隐藏表单"字段元素。

现在,在下面的$subscriberIdFromDb数组中,您可以看到4个测试用户。然而,当我运行下面的代码时,似乎总是添加ID为1的第五个用户。

我不明白为什么要添加第五个用户,我将数据库结果导出到这些测试数组中,并在不同的系统上尝试,但它仍然这样做,所以似乎是这段代码中的某些内容导致了问题。

你知道是什么导致了这个问题吗?

PHP数组从我的测试系统中所有用户的数据库结果返回。。。

<?php
$userArray = array (
  'seed_chris_id' => 
  array (
    'id' => 'seed_chris_id',
    'user_name' => 'chris',
    'first_name' => 'Chris',
    'last_name' => 'Olliver',
  ),
  1 => 
  array (
    'id' => '1',
    'user_name' => 'jasondavis',
    'first_name' => 'Jason',
    'last_name' => 'Davis',
  ),
  '1702c3d0-df12-2d1b-d964-521becb5e3ad' => 
  array (
    'id' => '1702c3d0-df12-2d1b-d964-521becb5e3ad',
    'user_name' => 'Jeff',
    'first_name' => 'Jeff',
    'last_name' => 'Mosley',
  ),
  'seed_jim_id' => 
  array (
    'id' => 'seed_jim_id',
    'user_name' => 'jim',
    'first_name' => 'Jim',
    'last_name' => 'Brennan',
  ),
  '6ce98c71-80c8-8b04-1767-52ccdd1b7c96' => 
  array (
    'id' => '6ce98c71-80c8-8b04-1767-52ccdd1b7c96',
    'user_name' => 'TestUser',
    'first_name' => 'John',
    'last_name' => 'Doe',
  ),
  'seed_max_id' => 
  array (
    'id' => 'seed_max_id',
    'user_name' => 'max',
    'first_name' => 'Max',
    'last_name' => 'Jensen',
  ),
  '1d77045b-fb16-d925-b19e-52c85d82bf81' => 
  array (
    'id' => '1d77045b-fb16-d925-b19e-52c85d82bf81',
    'user_name' => 'PortalUser',
    'first_name' => 'Portal',
    'last_name' => 'User',
  ),
  'seed_sally_id' => 
  array (
    'id' => 'seed_sally_id',
    'user_name' => 'sally',
    'first_name' => 'Sally',
    'last_name' => 'Bronsen',
  ),
  'seed_sarah_id' => 
  array (
    'id' => 'seed_sarah_id',
    'user_name' => 'sarah',
    'first_name' => 'Sarah',
    'last_name' => 'Smith',
  ),
  '95803cf3-84ea-493a-a030-52b0abcd9b0c' => 
  array (
    'id' => '95803cf3-84ea-493a-a030-52b0abcd9b0c',
    'user_name' => 'test',
    'first_name' => 'test',
    'last_name' => 'test',
  ),
  'seed_will_id' => 
  array (
    'id' => 'seed_will_id',
    'user_name' => 'will',
    'first_name' => 'Will',
    'last_name' => 'Westin',
  ),
);

PHP数组从我的订阅用户数据库结果返回。。。

$subscriberIdFromDb = array (
  0 => '1d77045b-fb16-d925-b19e-52c85d82bf81',
  1 => '95803cf3-84ea-493a-a030-52b0abcd9b0c',
  2 => 'seed_max_id',
  3 => 'seed_sally_id',
);


echo '<pre>';
print_r($subscriberIdFromDb);
echo '</pre>';

$hiddenSubscriberListIds = '';
$selHtml = '<select id="subscribersSelection" name="subscribers" data-placeholder="" style="width:350px;" multiple tabindex="3">';
foreach ($userArray as $userIdKey => $value) {
    if(in_array($userIdKey, $subscriberIdFromDb)) {
        echo '$userIdKey = '.$userIdKey. '<br>';
        $selHtml .= '<option value="'.$userIdKey.'" selected>'.$value['user_name'].'</option>';
        $hiddenSubscriberListIds .= '<input type="hidden" name="subscribers[]" value="'.$userIdKey.'" id="'.$userIdKey.'">';
    }else{
        $selHtml .= '<option value="'.$userIdKey.'">'.$value['user_name'].'</option>';
    }
}
$selHtml .= '</select>';
$selHtml .= $hiddenSubscriberListIds;
echo $selHtml;
?>

当上面的代码运行时,它输出这个HTML。。。

<select id="subscribersSelection" name="subscribers" data-placeholder="" style="width:350px;" multiple tabindex="3">
    <option value="seed_chris_id">chris</option>
    <option value="1" selected>jasondavis</option>
    <option value="1702c3d0-df12-2d1b-d964-521becb5e3ad">Jeff</option>
    <option value="seed_jim_id">jim</option>
    <option value="6ce98c71-80c8-8b04-1767-52ccdd1b7c96">TestUser</option>
    <option value="seed_max_id" selected>max</option>
    <option value="1d77045b-fb16-d925-b19e-52c85d82bf81" selected>PortalUser</option>
    <option value="seed_sally_id" selected>sally</option>
    <option value="seed_sarah_id">sarah</option>
    <option value="95803cf3-84ea-493a-a030-52b0abcd9b0c" selected>test</option>
    <option value="seed_will_id">will</option>
</select>
<input type="hidden" name="subscribers[]" value="1" id="1">
<input type="hidden" name="subscribers[]" value="seed_max_id" id="seed_max_id">
<input type="hidden" name="subscribers[]" value="1d77045b-fb16-d925-b19e-52c85d82bf81" id="1d77045b-fb16-d925-b19e-52c85d82bf81">
<input type="hidden" name="subscribers[]" value="seed_sally_id" id="seed_sally_id">
<input type="hidden" name="subscribers[]" value="95803cf3-84ea-493a-a030-52b0abcd9b0c" id="95803cf3-84ea-493a-a030-52b0abcd9b0c">

您可以看到<option value="1" selected>jasondavis</option><input type="hidden" name="subscribers[]" value="1" id="1">被添加,即使ID 1在我的数组中不存在!!!

尝试告诉in_array使用"严格"模式来比较值。

in_array($userIdKey, $subscriberIdFromDb, TRUE)

现在的情况是:$userIdKey1(一个整数),它正在与$subscriberIdFromDb中的每个值进行比较。它是这样比较的:1 == '1d77045b-fb16-d925-b19e-52c85d82bf81'

这两种类型不匹配,因此PHP将第二个字符转换为int。当将字符串转换为int时,PHP读取字符串,直到第一个非数字字符。因此CCD_ 11或CCD_。(请参见:https://eval.in/197010)

TRUE作为第三个参数传递给in_array使其使用===1 === '1d77045b-fb16-d925-b19e-52c85d82bf81'为false,因为类型不匹配。

附言:您也可以通过在$userArray中将1 =>更改为'1' =>来解决此问题。