• This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn more.

Work with Query Returns as Array and not Looping through them?

Marcus

Well-known member
#1
Can you work with the query returns as arrays? I only have luck with looping through the database returns. The arrays are a bit nested. This is an example from a textarea input where each line represents a new item and items can be added (or removed). The looping code is so much complicated, where a simple array_diff is much more elegant.

I would love to do this:
PHP:
$editorItems = input[from Editor template]

$editorItemArray = implode("\n", $editorItems) // that works

$existingItems  = db->fetchAll()

$existingItemsArray = get_item_id_out_of_QueryReturn($existingItemsArray) // that does not work

$existingItemsInEditor = array_intersect($editorItemArray, $existingItemsArray)
$removeItems = array_diff ($existingItemsInEditor , $existingItemsArray) 
$addItems = array_diff($existingItemsInEditor , $editorItemArray)

foreach ($addItems as $item) 
{
    dw->write
}

foreach ($removeItems as $item) 
{
    dw->delete
}
Currently my code is much more complicated by looping through the results
PHP:
$allItems  = db->fetchAll()
 
foreach ($allItems as $item)
{
  $existingItems[] = $item['item_id']}
}
 
$editorItems = input[from Editor template]
 
$editorItemArray = implode("\n", $editorItems) // that works
 
foreach ($editorItemArray as $item)
{
  if(!in_array($item, $allItems)
  {
    dw->write
    $addedItems[] = $item['item_id']
  }
}
 
$missingItems = array_diff( $existingItems, $addedItems )
 
foreach ($missingItems as $item)
{
    dw->delete
}
 

Jake Bunce

XenForo moderator
Staff member
#2
There are different fetch functions for the db object:

fetchAll = returns an array of rows
fetchRow = returns one row (which is an array)
fetchCol = returns an array of individual column values for multiple rows
fetchOne = fetches just one column for one row (not an array)

If your query returns only one row then use fetchRow. Then the result will be a straight array (no foreach required).
 

Marcus

Well-known member
#3
I want to get access to the fetchAll or fetchKeyed array I get from mysql. Like this:
PHP:
$pizza_ingredients = array(
  array('pizza_id'=>1,'ingredients_id'=>1),
  array('pizza_id'=>2,'ingredients_id'=>1),
  array('pizza_id'=>3,'ingredients_id'=>2)
);
How can I have direct access to the second row and the second item with PHP array functions and without looping? Thanks so much !
 

Marcus

Well-known member
#5
I googled but did not find out how to do that :( $pizza_ingredients['pizza_id'=>2] will output the second row and the second item ?

When I enter my integer values, I implode("\n", $stringTextarea) and array_filter($stringTextarea , 'trim'). But do you know how to make integers out of them with array_filter? This does not work:

PHP:
 array_filter($stringTextarea , 'intval')
PHP:
PHP array(3) { [0]=> string(5) "0001" [1]=> string(5) "003" [2]=> string(5) "04323" }
 

Chris D

XenForo developer
Staff member
#7
I'm not sure I've understood fully as I've only really scanned the text -- short attention span :p

If you want to fetch an array of results from a MySQL query and then access the second row, second column you would fetch the results like this:

PHP:
$results = $this->fetchAllKeyed = ('
	SELECT *
	FROM table
	WHERE something
', 'pizza_id');
The second row and second column (assuming from your example it is ingredients_id) would be:

PHP:
$secondRowSecondCol = $results[2]['ingredients_id'];
Based on the $this->fetchAllKeyed query, the index of the array is now the pizza_id. If you wanted the 564th line second column it would be $results[564]['ingredients_id'].