PHP array_diff_key () пуст, но не должен - PullRequest
0 голосов
/ 06 января 2019

Я запрашиваю серию таблиц, чтобы распечатать их, и я хочу напечатать все ключи каждой таблицы, даже если значения пусты, но определенный набор ключей, которые одинаковы для каждой таблицы, не должен печататься.

Мой запрос и выборка результата в массиве для одной таблицы:

$stmt = $db_conn->prepare("SELECT * FROM table;");
$stmt->execute();
$array = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();

var_export($array); возвращается:

array ( 0 => array ( 'a' => '1', 'b' => '2018-12-21', 'c' => '', 'd' => '', ), )

Я подготовил список плохих ключей в массиве:

var_export($bad_keys); возвращается:

array ( 0 => array ( 'a' => '1', 'b' => '2019-01-05', ), )

Для каждой таблицы я хочу исключить неверные ключи {a, b} из результата запроса в $array с помощью array_diff_key():

$array_new = array_diff_key($array, $bad_keys); 

var_dump($array_new); возвращает пустое значение:

array(0) { }.

$array_new должны иметь ключи {'c', 'd'}, но не имеют. Я не вижу ошибки в моем коде. Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Моя ошибка: в array_diff_key () я сравнил два многомерных массива без записи индекса [0] для каждого сравниваемого массива.

Решение: я добавил индекс [0] для каждого сравниваемого массива и дополнительно создал массив из результата array_diff_key ()

$array = array( 0 => 
     array( 
        'a' => '', 
        'b' => '', 
        'c' => '', 
        'd' => '', 
    ), 
);

$bad_keys = array( 0 => 
     array( 
        'a' => '', 
        'b' => '', 
    ), 
);

$array_new = array( array_diff_key( $array[0], $bad_keys[0] ));

var_export( $array_new );

теперь возвращает желаемый результат:

array( 0 => 
     array( 
        'c' => '', 
        'd' => '', 
    ), 
);
0 голосов
/ 06 января 2019

array_diff_key используется для вычисления разницы между ключами двух или более массивов, т. Е. Нового массива со всеми парами ключ / значение первого аргумента первого массива , имеющего ключи не существует ни в одном другом ключе аргумента массива .

В вашем коде вы пытаетесь сравнить keys вашего первого массива с массивом значений (т. Е. Ваш $bad_keys, фактически имеющий пронумерованные индексы), а не ключей массива $bad_keys. Это не как array_diff_key работает.

Обязательно проверьте ссылку по адресу: http://php.net/manual/en/function.array-diff-key.php

Один метод дает вам только те ключи, которые вы ищете в виде массива:
Просто создайте новый массив ключей первого массива как значения , а затем используйте array_diff, чтобы сравнить его с вашим $bad_keys.

Чтобы получить пары ключ / значение, вы можете использовать эту (как предложил Клон Квазимодо):

array_diff_key($array, array_flip($bad_keys))

ОБНОВЛЕНИЕ: ключи в первом массиве также не находятся на том же уровне, что и ключи в $bad_array.

...