Почему in_array () не работает на $ _POST? - PullRequest
3 голосов
/ 08 октября 2011

Я пытаюсь проверить, что отправленные данные этого пользователя, начиная с $_POST, содержат по крайней мере те же элементы, что и мой переданный массив. Я делаю это, потому что позже буду использовать эти элементы, вызывая $_POST['element'], и мне не нравится, что ошибок в том, что этот элемент не существует (не установлено). :)

Я не хочу использовать что-то вроде isset($_POST['x'], $_POST['y'], $_POST['z']), потому что каждый раз, когда мне нужно переписать $_POST, и это также кажется нечитаемым.

Я пытался использовать in_array(array('x', 'y', 'z'), $_POST), но он не работает (он возвращает false, когда должен возвращать true). Есть идеи, как заставить это работать? :) Я уверен, что у меня есть пустые строки как $_POST['x'], $_POST['y'] и $_POST['z']. Я даже пытался изменить значения трех элементов $_POST шланга на что-то отличное от пустой строки - все же ... не работает должным образом. (

Спасибо за совет! :)

Edit:

Только что обнаружил, что in_array() проверяет значения, а не ключи. Затем я попытался сделать так ...

in_array(array('title', 'slug', 'content'), array_keys($_POST))

Тем не менее, он возвращает false. Как это получается? /

Редактировать # 2:

Хорошо, вот результаты отладки ...

Входящие $_POST:

array(3) {
    ["title"]=>
    string(0) ""
    ["slug"]=>
    string(0) ""
    ["content"]=>
    string(0) ""
}

Результат array_keys($_POST):

array(3) {
    [0]=>
    string(5) "title"
    [1]=>
    string(4) "slug"
    [2]=>
    string(7) "content"
}

Результат in_array(array('title', 'slug', 'content'), array_keys($_POST)):

bool(false)

Вопрос ... почему это false? Я все сделал правильно, насколько я знаю.

Редактировать # 3:

В конце я создал свой собственный метод с именем Arr::keys_exists($keys, $array).

Ответы [ 8 ]

7 голосов
/ 08 октября 2011

in_array() проверяет, существует ли в массиве значение , а не ключ .Если вы хотите проверить, существует ли ключ, вам нужно что-то вроде ...

in_array('x', array_keys($_POST));

или более простого ...

array_key_exists('x', $_POST);

ЕслиВы хотите проверить несколько ключей одновременно:

$required_keys = array('x'=>1, 'y'=>1, 'z'=>1);
$missing_keys = array_diff_key($required_keys, $_POST);
$missing_keys_count = count($missing_keys);
1 голос
/ 08 октября 2011

Потому что in_array проверяет, точно ли находится игла в массиве. Смотрите пример № 3 справочной страницы. array_key_exists не может работать с ключом в качестве первого аргумента, поскольку массивы недопустимы с массивами в качестве ключей.

Вы хотите что-то вроде all_in_array(array $needles, array $haystack); или array_all_keys_exists(array $keys, array $search);, которое возвращает все ли элементы в массиве. Вероятно, вы можете реализовать что-то подобное самостоятельно или попросить о помощи здесь.

0 голосов
/ 08 октября 2011

@ Эрик был прав, попробуйте это -

in_array(array('title', 'slug', 'content'), array(array_keys($_POST)))
0 голосов
/ 08 октября 2011

Вы не понимаете in_array.

$a = array(
    'x' => 1
);
echo in_array(array('x', 'y', 'z'), $a); // false

$a['an array'] = array('x', 'y', 'z');
echo in_array(array('x', 'y', 'z'), $a); // true
0 голосов
/ 08 октября 2011

Если вы хотите обеспечить наличие нескольких клавиш, тогда может быть применимо array_diff:

!array_diff(array('title', 'slug', 'content'), array_keys($_POST))

Возможно, вас также заинтересует array_intersect_uassoc.

0 голосов
/ 08 октября 2011
function getPost( $index, $default = '' )
{
    if ( isset( $_POST[ $index ] ) )
    {
        return $_POST[ $index ];
    }

    return $default;
}
0 голосов
/ 08 октября 2011

Прежде всего:

Я не хочу использовать что-то вроде isset ($ _ POST ['x'], $ _POST ['y'], $ _POST ['z']), потому что каждый раз, когда мне нужно переписать $ _POST, и кажется, также не читается.

Вы никогда не должны менять один из суперглобалей;)

Однако in_array() ищет значения, а не ключи

in_array(array('x', 'y', 'z'), array_key($_POST))
0 голосов
/ 08 октября 2011

in_array (массив ('x', 'y', 'z'), $ _POST), но он не работает (он возвращает false, когда должен вернуть true)

Нет, не должно. Прочитайте инструкцию in_array .

Проверяет, существует ли значение в массиве

Вместо этого вы хотели бы проверить ключи массива. Получите все ключи с помощью array_keys , а затем используйте in_array.

С помощью in_array вы можете одновременно проверять только одно значение, а не целый массив значений, как вы пытаетесь это сделать.

Другими словами, если вы делаете:

in_array(array('title', 'slug', 'content'), array_keys($_POST))

Он найдет один элемент массива ключей, содержащий массив с заголовком, слагом и комментарием, а это не то, что вам нужно.

...