2015-07-24 2 views
2

Я пытаюсь создать ассоциативный массив в PHP.Странное поведение ассоциативного массива в PHP

Идея состоит в том, чтобы хранить «Item Id» в качестве ключа массива и общую сумму расходов на этот идентификатор элемента в качестве значения.

Я использую следующий код, чтобы получить данные из моих двух отдельных таблиц MYSQL, один из которых содержит информацию о товаре и та, которая содержит список расходов.

// GET ITEM DATA FROM DB 
    $getItemData = mysql_query("SELECT * FROM items;"); 

    // CREATE ARRAY 
    $orderItemsBySpend = array(); 

    // LOOP THROUGH ITEMS AND CALCULATE SPEND IN LAST 30 DAYS 
    while($itemData = mysql_fetch_assoc($getItemData)){ 


     $getItemExpenses = mysql_query(" 
     SELECT SUM(cost) 
     AS productExpenses 
     FROM expenses 
     WHERE itemId = $itemData[id] 
     AND date BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW();"); 

     $itemExpenses = mysql_fetch_assoc($getItemExpenses); 

     // SET TOTAL SPEND VARIABLE 
     $totalProductSpend = $itemExpenses['productExpenses']; 

     // SET ITEM ID VARIABLE 
     $itemId = $itemData[id]; 

     // ADD KEY AND VALUE TO ARRAY 
     $orderItemsBySpend[$itemId] = $totalProductSpend; 

     // PRINT ARRAY FOR TESTING PURPOSES 
     print_r($orderItemsBySpend); 
    } 

К сожалению, вместо того, чтобы получить что-то вроде этого, как я хотел бы ожидать (и надеюсь на!)

Примечание 0.00 значения являются только сводится к тому, есть только ограниченные данные в таблице расходов.

Array (
[1] => 14.01 
[2] => 0.00 
[3] => 0.00 
[4] => 0.00 
[5] => 0.00 
[6] => 20.24 
[7] => 0.00 
[8] => 0.00 
[9] => 0.00 
) 

Вместо этого я получаю это:

Array ( 
[0] => 14.01 
) 

Array ( 
[0] => 14.01 
[1] => 0.00 
) 

Array ( 
[0] => 14.01 
[1] => 0.00 
[2] => 0.00 
) 

Array (
[0] => 14.01 
[1] => 0.00 
[2] => 0.00 
[3] => 0.00 
) 

etc. 

Мой вопрос: Почему это странно «инкрементальный картина» массивов создается? И почему ключ массива не задан как идентификатор элемента?

Первый массив должен иметь ключ от 1 (первый элемент Id), а не 0.

Все советы оценили!

Thanks,

Bruce.

+2

_ «Почему этот странный« инкрементный шаблон »создаваемых массивов? «_ - просто вы выводите массив в каждой итерации цикла ...? – CBroe

+2

И вообще, запросы базы данных в циклах считаются очень плохими идеями, с точки зрения производительности. Используйте один запрос, который вместо этого использует GROUP BY. – CBroe

ответ

3

Проблема заключается в том, что вы печатаете свой массив в неправильном месте. Это внутри петли прямо сейчас, так как это печатает таким образом. Просто удалите его внутри цикла while() и поставьте его в замкнутый контур. Сделайте, как показано ниже: -

while(){ 
} 
print_r(); 

Примечания: - Полезное предложение переключиться на mysqli_* или PDO лучше, потому что mysql_* официально осуждаются.

+0

Спасибо, в этом была проблема –

+0

Рад помочь вам. Приятно. Спасибо за маркировку. :) :) –

0

$itemId = $itemData[id]; есть проблема.

Переменная $itemData[id] не существует в контексте этого цикла, так что приводит к нулевому значению, а затем

$orderItemsBySpend[$itemId] = $totalProductSpend; 

фактически становится

$orderItemsBySpend[] = $totalProductSpend; 

Вместо этого попробуйте:

$itemId = $itemData['id'];