By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
438,303 Members | 1,245 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 438,303 IT Pros & Developers. It's quick & easy.

How to remove row from ezSQL object?

P: n/a
I need to loop through a number of categories (in object $category) and compare
items (from object $itemdata) to create a list of items organized by category.

foreach ($category as $cat_item)
{
echo $cat_item->cat_name;
foreach ($itemdata as $item_datum)
{
if ($item_datum->category_id == $cat_item->cat_id)
{
echo '--'.$item_datum->item_name;
}
}
}

The output should look something like this:

Apples (cat_name)
-- red (item_name)
-- green
-- small
-- large

Oranges
-- ripe
-- rotten

The $category and $itemdata objects are created using ezSQL:

$category = $db->get_results("SELECT cat_id, cat_name ... FROM Table_A");

$itemdata = $db->get_results("SELECT category_id, item_name ... FROM Table_B");

My question is this:

How do I optimize this?

Once an $item_datum->category_id has been matched to a $cat_item->cat_id, I no
longer need that row ($item_datum) in the $itemdata object, so further
iterations of the nested foreach loop need not include the previously matched
$item_datum.

How do I remove the matched $item_datum from the $itemdata object after it has
been matched?

Will this reduce iterations of the nested foreach loop?

Thanks in advance.

Feb 27 '07 #1
Share this Question
Share on Google+
6 Replies


P: n/a
deko wrote:
I need to loop through a number of categories (in object $category) and
compare items (from object $itemdata) to create a list of items
organized by category.

foreach ($category as $cat_item)
{
echo $cat_item->cat_name;
foreach ($itemdata as $item_datum)
{
if ($item_datum->category_id == $cat_item->cat_id)
{
echo '--'.$item_datum->item_name;
}
}
}

The output should look something like this:

Apples (cat_name)
-- red (item_name)
-- green
-- small
-- large

Oranges
-- ripe
-- rotten

The $category and $itemdata objects are created using ezSQL:

$category = $db->get_results("SELECT cat_id, cat_name ... FROM Table_A");

$itemdata = $db->get_results("SELECT category_id, item_name ... FROM
Table_B");

My question is this:

How do I optimize this?

Once an $item_datum->category_id has been matched to a
$cat_item->cat_id, I no longer need that row ($item_datum) in the
$itemdata object, so further iterations of the nested foreach loop need
not include the previously matched $item_datum.

How do I remove the matched $item_datum from the $itemdata object after
it has been matched?

Will this reduce iterations of the nested foreach loop?

Thanks in advance.
I don't use ezSQL, but you should be able to get all of your items by
category id, i.e.

SELECT cat_id, cat_name, item_name ... FROM Table_A, Table_B WHERE
TableA.cat_id = Table_B.category_id ORDER BY cat_name, item_name

Or similar. Now just go through the list. Every time your cat_name
changes, output cat_name followed by item_name. If cat_name doesn't
change, just output item_name.

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================
Feb 27 '07 #2

P: n/a
deko wrote:
>I need to loop through a number of categories (in object $category) and
compare items (from object $itemdata) to create a list of items organized by
category.

foreach ($category as $cat_item)
{
echo $cat_item->cat_name;
foreach ($itemdata as $item_datum)
{
if ($item_datum->category_id == $cat_item->cat_id)
{
echo '--'.$item_datum->item_name;
}
}
}

The output should look something like this:

Apples (cat_name)
-- red (item_name)
-- green
-- small
-- large

Oranges
-- ripe
-- rotten

The $category and $itemdata objects are created using ezSQL:

$category = $db->get_results("SELECT cat_id, cat_name ... FROM Table_A");

$itemdata = $db->get_results("SELECT category_id, item_name ... FROM
Table_B");

My question is this:

How do I optimize this?

Once an $item_datum->category_id has been matched to a $cat_item->cat_id, I
no longer need that row ($item_datum) in the $itemdata object, so further
iterations of the nested foreach loop need not include the previously matched
$item_datum.

How do I remove the matched $item_datum from the $itemdata object after it
has been matched?

Will this reduce iterations of the nested foreach loop?

Thanks in advance.

I don't use ezSQL, but you should be able to get all of your items by category
id, i.e.

SELECT cat_id, cat_name, item_name ... FROM Table_A, Table_B WHERE
TableA.cat_id = Table_B.category_id ORDER BY cat_name, item_name

Or similar. Now just go through the list. Every time your cat_name changes,
output cat_name followed by item_name. If cat_name doesn't change, just
output item_name.
Unfortunately, the problem is more complex than those example queries make it
look (they were simplified for clarity).

ezSQL aside, I think the issue is removing an item from an object in PHP. I'm
assuming there's a way to do this... (?)

Feb 27 '07 #3

P: n/a
ezSQL aside, I think the issue is removing an item from an object in PHP

I tried this:

foreach ($category as $cat_item)
{
echo $cat_item->cat_name;
foreach ($itemdata as $item_datum)
{
if ($item_datum->category_id == $cat_item->cat_id)
{
echo '--'.$item_datum->item_name;
array_splice($itemdata, current($itemdata), 1);
}
}
};

which sees to work, but not accurately... if the matched item_datum is the first
in the array, the second element is removed.

Feb 27 '07 #4

P: n/a
$i =1
foreach ($category as $cat_item)
{
echo $cat_item->cat_name;
foreach ($itemdata as $item_datum)
{
if ($item_datum->category_id == $cat_item->cat_id)
{
echo '--'.$item_datum->item_name;
array_splice($itemdata, $item_data[$i - 2], 1);
reset($itemdata);
}
}
}

This seems to work.

Is there a way to access the array indexer so I don't have to use $i?

I tried prev($itemdata) but could not get that to work for some reason....
Feb 27 '07 #5

P: n/a
This is a better example:

$category = $db->get_results("SELECT cat_id, cat_name ... FROM Table_A");
$itemdata = $db->get_results("SELECT category_id, item_name ... FROM Table_B");

$i =0
foreach ($category as $cat_item)
{
echo $cat_item->cat_name;
foreach ($itemdata as $item_datum)
{
if ($item_datum->category_id == $cat_item->cat_id)
{
echo '--'.$item_datum->item_name;
array_splice($itemdata, $item_data[$i - 1], 1);
//the next category will not contain the matched item
//since items can only belong to one category
//so we can remove matched item_datum from itemdata
//and reduce iterations next time we are in this loop
}
$i++;
}
}

Apples (cat_name)
-- red (item_name)
-- green
-- small
-- large
Oranges
-- ripe
-- rotten

$itemdata is an object, not an array, which is why I need to index it with $i
(object items do not have numeric keys). So $i indexes the items in the
$itemdata object, allowing me to use array_splice() on an object... ?

Feb 28 '07 #6

P: n/a
deko wrote:
This is a better example:

$category = $db->get_results("SELECT cat_id, cat_name ... FROM Table_A");
$itemdata = $db->get_results("SELECT category_id, item_name ... FROM
Table_B");

$i =0
foreach ($category as $cat_item)
{
echo $cat_item->cat_name;
foreach ($itemdata as $item_datum)
{
if ($item_datum->category_id == $cat_item->cat_id)
{
echo '--'.$item_datum->item_name;
array_splice($itemdata, $item_data[$i - 1], 1);
//the next category will not contain the matched item
//since items can only belong to one category
//so we can remove matched item_datum from itemdata
//and reduce iterations next time we are in this loop
}
$i++;
}
}

Apples (cat_name)
-- red (item_name)
-- green
-- small
-- large
Oranges
-- ripe
-- rotten

$itemdata is an object, not an array, which is why I need to index it
with $i (object items do not have numeric keys). So $i indexes the items
in the $itemdata object, allowing me to use array_splice() on an
object... ?
http://us2.php.net/manual/en/control...es.foreach.php
and
http://us2.php.net/manual/en/function.unset.php

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================
Feb 28 '07 #7

This discussion thread is closed

Replies have been disabled for this discussion.