It is a bad idea for performance reasons to run a query and then for each record run another query (and then for each of THOSE records run yet another query). If each query return 100 records every time, you could end up running a million queries for a single run of the page.
You can often avoid this sort of thing by using a JOIN between two tables. Here's your outermost query:
$query1 = "SELECT plItemID, plBotanicalName, plSize, plQty FROM plant_list_stock WHERE plID = '$pl_listid' AND plContID = '$contid'";
Here's the next query:
$query2 = "SELECT * FROM item_supplier WHERE ItemID = '$stockitemID' ORDER BY ValidFrom Desc";
where $stockitemID is plItemID from the first result.
You can combine those two queries and the last query using a join
$join_query = "SELECT pls.plItemID, pls.plBotanicalName, pls.plSize, pls.plQty, is.*, s.*
FROM plant_list_stock pls
LEFT JOIN item_supplier is
ON is.ItemID=pls.plItemID
LEFT JOIN suppliers s
ON s.SupplierID=is.SupplierID
WHERE pls.plID = '$pl_listid' AND pls.plContID = '$contid'";
This will result in one query returning a list of the plant list stock along with the supplier (if any). You'll have to be a bit more clever about how you loop through it to get the array you are after, but it should be more efficient.
Also, you should use [man]mysqli[/man] instead of [man]mysql[/man]. mysql is going away and mysqli is the new stuff.