根据 SQL 查询从多维数组中删除数组
Remove array from a multidimensional array based on a SQL query
我的多维数组是:
Array (
[0] => stdClass Object (
[processId] => H5-05848939
[productCode] => ITBYMZ
[availabilityStatus] => InstantConfirmation
[totalPrice] => 27
[packagingType] => Box
)
[1] => stdClass Object (
[processId] => H5-05848939
[productCode] => ITOLDZ
[availabilityStatus] => InstantConfirmation
[totalPrice] => 37
[packagingType] => Box
)
[2] => stdClass Object (
[processId] => H5-05848939
[productCode] => IYDYMZ
[availabilityStatus] => InstantConfirmation
[totalPrice] => 37
[packagingType] => Bulk
)
)
我有一个 SQL 数据库,其中包含几乎所有的产品图片。
我需要从上面的数组中删除所有没有图像的产品。
我使用以下代码查询 sql 数据库:
for ($n = 0; $n < 60; $n++) {
$productc= $productCodes[$n];
$result = mysql_query("SELECT ImageURL FROM Flat_table where ProductCode= '$productc'", $link);
if (!$result) {
die("Database query failed: " . mysql_error());
}
while ($row = mysql_fetch_array($result)) {
$ImageURL[$n] = $row["ImageURL"];
}
}
知道我该怎么做吗:
我需要从上面的数组中删除所有没有图像的产品。
因此,首先提取所有没有图像的产品代码,例如:
SELECT f.ProductCode FROM Flat_table f WHERE f.ImageURL IS NULL
请注意,如果您的字段在空时不是 NULL
,而是类似于 0
或空字符串,那么您需要调整该查询。在将所有这些 id 放入一个数组后(循环结果并创建一个类似于 Array('IYDYMZ', 'ITOLDZ')
的数组),您可以在产品对象数组上使用数组过滤器:
$filtered = array_filter($arr, function ($a) use ($noImageIds) {
return !(in_array($a->productCode, $noImageIds));
});
此外,您应该真正使用 PDO 或 mysqli,mysql_*
函数已被弃用,因此对于 PDO,完整的解决方案可能如下所示:
// our array from the api is called $products
$db = new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$stmt = $db->prepare('SELECT f.ProductCode FROM Flat_table f WHERE f.ImageURL IS NULL');
$stmt->execute();
$noImageProducts = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
$filteredProducts = array_filter($products, function ($a) use ($noImageProducts) {
// returning true means "keep", while false means omit
// if the productCode is in the array it doesnt have an image
return !(in_array($a->productCode, $noImageProducts));
});
} catch (Exception $e) {
echo $e->getMessage();
}
我的多维数组是:
Array (
[0] => stdClass Object (
[processId] => H5-05848939
[productCode] => ITBYMZ
[availabilityStatus] => InstantConfirmation
[totalPrice] => 27
[packagingType] => Box
)
[1] => stdClass Object (
[processId] => H5-05848939
[productCode] => ITOLDZ
[availabilityStatus] => InstantConfirmation
[totalPrice] => 37
[packagingType] => Box
)
[2] => stdClass Object (
[processId] => H5-05848939
[productCode] => IYDYMZ
[availabilityStatus] => InstantConfirmation
[totalPrice] => 37
[packagingType] => Bulk
)
)
我有一个 SQL 数据库,其中包含几乎所有的产品图片。 我需要从上面的数组中删除所有没有图像的产品。
我使用以下代码查询 sql 数据库:
for ($n = 0; $n < 60; $n++) {
$productc= $productCodes[$n];
$result = mysql_query("SELECT ImageURL FROM Flat_table where ProductCode= '$productc'", $link);
if (!$result) {
die("Database query failed: " . mysql_error());
}
while ($row = mysql_fetch_array($result)) {
$ImageURL[$n] = $row["ImageURL"];
}
}
知道我该怎么做吗: 我需要从上面的数组中删除所有没有图像的产品。
因此,首先提取所有没有图像的产品代码,例如:
SELECT f.ProductCode FROM Flat_table f WHERE f.ImageURL IS NULL
请注意,如果您的字段在空时不是 NULL
,而是类似于 0
或空字符串,那么您需要调整该查询。在将所有这些 id 放入一个数组后(循环结果并创建一个类似于 Array('IYDYMZ', 'ITOLDZ')
的数组),您可以在产品对象数组上使用数组过滤器:
$filtered = array_filter($arr, function ($a) use ($noImageIds) {
return !(in_array($a->productCode, $noImageIds));
});
此外,您应该真正使用 PDO 或 mysqli,mysql_*
函数已被弃用,因此对于 PDO,完整的解决方案可能如下所示:
// our array from the api is called $products
$db = new PDO($dsn, $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try {
$stmt = $db->prepare('SELECT f.ProductCode FROM Flat_table f WHERE f.ImageURL IS NULL');
$stmt->execute();
$noImageProducts = $stmt->fetchAll(PDO::FETCH_COLUMN, 0);
$filteredProducts = array_filter($products, function ($a) use ($noImageProducts) {
// returning true means "keep", while false means omit
// if the productCode is in the array it doesnt have an image
return !(in_array($a->productCode, $noImageProducts));
});
} catch (Exception $e) {
echo $e->getMessage();
}