2015-02-04 3 views
2

Мой многомерный массив:Удалить массив из многомерного массива на основе запроса SQL

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"]; 
    } 
} 

есть какие-ideea, как я могу это сделать: Мне нужно удалить из массива выше все продукты, которые не имеют изображения.

+0

Каково происхождение многомерного массива? от БД тоже? почему бы не просто запросить те записи, у которых есть URL-адрес изображения – Ghost

+0

@Ghost его ответ SOAP – em0tic0n

+0

, если его не так много, ну, вы можете, запросить каждый элемент и проверить, и нет необходимости в цикле while, если каждый код уникален – Ghost

ответ

1

Так первый раз вытаскивать все коды продуктов, которые не имеют изображения, как:

SELECT f.ProductCode FROM Flat_table f WHERE f.ImageURL IS NULL 

Примечание Если поля не NULL когда пусто, но что-то вроде 0 или и пустая строка, то вы будете должны регулировать, что запрос. После того, как все эти идентификаторы в массиве (цикл по результату и сделать массив как 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(); 
} 
+0

Я добавил некоторые основные проверки ошибок. Вы не должны получать эту ошибку, если '$ db-> prepare()' не может подготовить запрос, но тогда вы должны получить его, как только '$ stmt-> execute()', поскольку '$ stmt' будет false ... – prodigitalson

+0

Мне удалось исправить ошибку (некоторые ошибочные vars) Но всегда $ noImageHotels пуст Я не вижу, где создается массив. – em0tic0n

Смежные вопросы