Я запрашиваю серию таблиц, чтобы распечатать их, и я хочу напечатать все ключи каждой таблицы, даже если значения являются пустыми, но определенный набор ключей, которые являются одинаковыми для каждой таблицы, не должен печататься.
Мой запрос и выборка результата в массиве для одной таблицы:
$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 15:22:12.537', 'c' => '', 'd' => '', ), )
Я подготовил список плохих ключей в массиве:
var_export($bad_keys);
возвращает:
array ( 0 => array ( 'a' => '1', 'b' => '2019-01-05 22:07:18.360', ), )
Для каждой таблицы я хочу исключить плохие ключи {a, b} из результата запроса в $array
с помощью array_diff_key()
:
$array_new = array_diff_key($array, $bad_keys);
var_dump($array_new);
возвращает пустое:
array(0) { }
,
$array_new
должен иметь ключи {‘c’, ‘d’}, но не имеет. Я не вижу ошибки в моем коде. Пожалуйста помоги.
array_diff_key
используется для вычисления разницы между ключи из двух или более массивов, то есть нового массива со всеми парами ключ / значение первый аргумент массива имея ключи не существует ни в одном другом ключи аргумента массива возвращаются.
В своем коде вы пытаетесь сравнить ключи вашего первого массива с массивом ценности (т. е. ваш $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
,
Других решений пока нет …