Почему функция PHP не может найти элемент in_array? - PullRequest
0 голосов
/ 31 октября 2018

Я гуглил и много раз искал в StackOverflow прочитав полное руководство по PHP для in_array(), но все еще придерживался того, что, как я думал, будет очень простой задачей.

Итак, у меня есть этот массив в моем файле config.php:

$page_access = array(
    'index' => array('1', '2', '3'),
    'users' => array('4', '5', '6')
);

В functions.php у меня есть:

include 'config.php';

function level_access($page){
    global $page_access;
    if(in_array($page, $page_access)){
        echo "yes";
    } else {
        echo "no";
    }
}

level_access('index');

Я ожидал получить «да» в качестве вывода, потому что тогда я бы сделал что-то еще в функции, но я застрял с выводом «нет», независимо от того, что я делаю.

Я уже пытался print_r($page_access) ВНУТРИ функции просто проверить, может ли она прочитать массив, и ОНА возвращает мне весь массив (что означает, что функция достигает внешнего массива), но каждый раз, когда отвечает на in_array() - это НЕТ.

Ответы [ 4 ]

0 голосов
/ 31 октября 2018

Нельзя использовать функцию in_array() для многомерного массива. Вместо этого вы можете использовать array_key_exists(), чтобы проверить, существует ключ или нет.

function level_access($page)
{
    global $page_access;
    if (array_key_exists($page, $page_access)) {
        echo "yes";
    } else {
        echo "no";
    }
}
0 голосов
/ 31 октября 2018

index - это ключ вашего подмассива, а не его значение. in_array() будет искать его значения в массиве, а не его индексы.

Вместо этого вы можете использовать array_key_exists() или isset(). При использовании isset() вы проверяете, установлен ли индекс массива.

if (array_key_exists($page, $page_access)) {
    echo "yes";
}

// Or..

if (isset($page_access[$page])) {
    echo "yes";
}
  • isset() сообщит вам, установлен ли индекс массива, и его значение не равно нулю
  • array_key_exists() определенно сообщит вам, существует индекс в массиве или нет, даже если значение равно нулю или нет

См. живое демо .

При этом использование ключевого слова global не поощряется , и вместо этого вам следует передать переменную в качестве аргумента функции.

$page_access = array(
    'index' => array('1', '2', '3'),
    'users' => array('4', '5', '6')
);

function level_access($page, $page_access) {
    // Either isset() or array_key_exists() will do - read their docs for more info
    // if (array_key_exists($page, $page_access)) {
    if (isset($page_access[$page])) {
        echo "yes";
    } else {
        echo "no";
    }
}
level_access($page, $page_access);

См. Являются ли глобальные переменные в PHP плохой практикой? Если так, то почему?

0 голосов
/ 31 октября 2018

Вы ищете значения с помощью in_array(), вы не можете это использовать. Скорее используйте array_key_exists().

0 голосов
/ 31 октября 2018

index - это просто ключ в вашем массиве $pages_access. in_array проверяет значения. Чтобы исправить свой код:

function level_access($page){
    global $page_access;
    if(in_array($page, array_keys($page_access))){
        echo "yes";
    } else {
        echo "no";
    }
}
...