PHP array_diff_key() 为空但不应该
PHP array_diff_key() is empty but should not
我查询了一系列 tables 以便打印这些,我想打印每个 table 的所有键,即使这些值是空的,但是一组特定的键每个都相同table 不得打印。
我在一个数组中查询和获取结果 table:
$stmt = $db_conn->prepare("SELECT * FROM table;");
$stmt->execute();
$array = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
var_export($array);
returns:
array ( 0 => array ( 'a' => '1', 'b' => '2018-12-21', 'c' => '', 'd' => '', ), )
我准备了一个数组中的坏键列表:
var_export($bad_keys);
returns:
array ( 0 => array ( 'a' => '1', 'b' => '2019-01-05', ), )
对于每个 table 我想通过使用 array_diff_key()
:
从 $array
的查询结果中排除坏键 {a, b}
$array_new = array_diff_key($array, $bad_keys);
var_dump($array_new);
returns空:
array(0) { }
.
$array_new
应该有键 {'c', 'd'} 但它没有。我没有在我的代码中看到错误。请帮忙。
array_diff_key
用于计算两个或多个数组的 keys 之间的差异,即具有所有 key/value 对的新数组 第一个数组参数 具有不存在于任何其他 数组参数的键 的键。
在您的代码中,您尝试将第一个数组的 keys 与 values 的数组进行比较(即您的 $bad_keys
,实际上有编号的索引),而不是 $bad_keys
数组的 keys。 不是array_diff_key
的工作方式。
请务必查看参考资料:http://php.net/manual/en/function.array-diff-key.php
一种方法只提供您要查找的键作为数组:
只需将第一个数组的键创建一个新数组作为 values 然后使用 array_diff
将其与您的 $bad_keys
.
进行比较
要获得 key/value 对,你可以使用这个(正如 Quasimodo 的克隆建议的那样):
array_diff_key($array, array_flip($bad_keys))
更新:第一个数组中的键也与 $bad_array
中的键不在同一级别。
我的错误:在 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 );
现在returns想要的结果:
array( 0 =>
array(
'c' => '',
'd' => '',
),
);
我查询了一系列 tables 以便打印这些,我想打印每个 table 的所有键,即使这些值是空的,但是一组特定的键每个都相同table 不得打印。
我在一个数组中查询和获取结果 table:
$stmt = $db_conn->prepare("SELECT * FROM table;");
$stmt->execute();
$array = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
var_export($array);
returns:
array ( 0 => array ( 'a' => '1', 'b' => '2018-12-21', 'c' => '', 'd' => '', ), )
我准备了一个数组中的坏键列表:
var_export($bad_keys);
returns:
array ( 0 => array ( 'a' => '1', 'b' => '2019-01-05', ), )
对于每个 table 我想通过使用 array_diff_key()
:
$array
的查询结果中排除坏键 {a, b}
$array_new = array_diff_key($array, $bad_keys);
var_dump($array_new);
returns空:
array(0) { }
.
$array_new
应该有键 {'c', 'd'} 但它没有。我没有在我的代码中看到错误。请帮忙。
array_diff_key
用于计算两个或多个数组的 keys 之间的差异,即具有所有 key/value 对的新数组 第一个数组参数 具有不存在于任何其他 数组参数的键 的键。
在您的代码中,您尝试将第一个数组的 keys 与 values 的数组进行比较(即您的 $bad_keys
,实际上有编号的索引),而不是 $bad_keys
数组的 keys。 不是array_diff_key
的工作方式。
请务必查看参考资料:http://php.net/manual/en/function.array-diff-key.php
一种方法只提供您要查找的键作为数组:
只需将第一个数组的键创建一个新数组作为 values 然后使用 array_diff
将其与您的 $bad_keys
.
要获得 key/value 对,你可以使用这个(正如 Quasimodo 的克隆建议的那样):
array_diff_key($array, array_flip($bad_keys))
更新:第一个数组中的键也与 $bad_array
中的键不在同一级别。
我的错误:在 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 );
现在returns想要的结果:
array( 0 =>
array(
'c' => '',
'd' => '',
),
);