2014-01-05 2 views
0

У меня есть json-объект в моем php-скрипте, который был закодирован с использованием функции php json_encode.PHP JSON Количество значений в одном массиве

Вот объект, когда var_dumped ...

string '{"voting_sys":"50","beta_site":"50"}' (length=36) 
string '{"voting_sys":"50","beta_site":"50"}' (length=36) 

структура базы данных: Database Structure

Моя цель состоит в том, чтобы получить сумму значений в voting_sys для каждого пользователя, и в beta_site. ..Это будет использоваться для голосования, но по неизвестному количеству функций/значений.

Любые идеи? Я пробовал следующее ...

$voters = DB::table('votes')->get(); 
    foreach($voters as $vote){ 
      $vote_array[$voter->user_id]=json_decode($voter->value, true); 
    } 
    var_dump($vote_array); 

Это возвращает декодированный json-объект в массив. Я бы назначил «vote_sys» в качестве ключа для массива, а затем целочисленное значение для значения массива, но будет неизвестное количество функций. В этом примере есть только две функции, которые пользователи могут проголосовать, но может быть и больше на более позднем этапе. Я использую идентификатор функции для развертывания нового набора функций, на которые могут голосовать пользователи.

Я использую Laravel 4.1

[Edit: Результат]

$feature_list = DB::table('features')->where('rev_id', Config::get('app.beta_rev'))->get(); 
    $feature_array=array(); 
    foreach ($feature_list as $feature){ 
     array_push($feature_array, $feature->name); 
    } 
    foreach($feature_array as $feature){ 
     $voters = DB::table('votes') 
       ->select(DB::raw('sum(value)')) 
       ->where('feature_name', '=', $feature) 
       ->get(); 
       echo $feature.' - '; 
       var_dump($voters); 
       echo '<br />'; 
    } 

, которые при вызове, отвалов:

voting_sys - 
array (size=1) 
    0 => 
    object(stdClass)[248] 
     public 'sum(value)' => string '149' (length=3) 

beta_site - 
array (size=1) 
    0 => 
    object(stdClass)[249] 
     public 'sum(value)' => string '69' (length=2) 

который является точно правильным для голосов я введенными. Спасибо за помощь.

ответ

1

Я бы предложил использовать немного другую структуру базы данных. Почти никогда не рекомендуется сериализовать/json_encode данные в вашей базе данных. Поскольку у вас уже есть специальная таблица для голосов он должен быть простым, чтобы изменить вашу таблицу от того, что вы curretly должны в следующем:

id | user_id | feature | value 
------------------------------ 
1 |  2 | sys  | 50 
2 |  2 | beta | 40 
3 |  3 | sys  | 50 

Это сделало бы подсчет очень тривиальна:

SELECT SUM(value) FROM table WHERE feature = 'sys' 
+0

он использует laravel – underscore

+0

Это не должно иметь значения. Каждая платформа/ORM позволяет создавать пользовательские запросы. – Dragony

+0

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

1

Использование array_sum

array_sum - Вычислить сумму значений в массиве

$voters = DB::table('votes')->get(); // get the JSON response response 


$jsonDecodedArray = json_decode($voters,true); // decode the JSON 

$sum = array_sum($jsonDecodedArray); // Use php array_sum 
+0

Не будет ли это просто подсчет количества функций? Мне нужно получить сумму значений функций. Я обновил этот вопрос, так как это было немного запутанно. –

+0

sorry.use array_sum function :) – underscore

+0

должно быть, 'json_decode ($ voters, true);'? для использования функций array_ * вам нужен массив, а не объект. В любом случае, с небольшими изменениями, он добавляет значения из каждой пользовательской заявки вместо количества голосов за каждую функцию ... –

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