2016-03-17 1 views
1

Я использую JSON для хранения результатов для скобокJSON Decode изменение значений в массиве

Верхних кронштейн магазинов 15 матчей нижнего кронштейн хранит 14 матчей Финала имеет 3 матча

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

echo json_encode ($ results);

будет выдавать

[0,0][0,0][0,0][0,0][3,5][0,0][0,0][0,0] 
[0,0][0,0][0,0][0,0] 
[0,0][0,0] 
[0,0] 

, когда я хочу, чтобы выдавать

[ 
    [[0,0],[0,0],[0,0],[0,0],[3,5],[0,0],[0,0],[0,0]], 
    [[0,0],[0,0],[0,0],[0,0]], 
    [[0,0],[0,0]], 
    [[0,0]] 
] 

Второго вопрос переменного $ матч петля увеличивается на раундах так выдает:

1,2,3,4,5,6,7,8,1,2,3,4,1,2,1 

когда я хочу его выдать

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 

Любая помощь приветствуется. Ниже приведен код:

<?php 

$upper_bracket_results = " 
[ 
[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], 
[[0,0],[0,0],[0,0],[0,0]], 
[[0,0],[0,0]], 
[[0,0]] 
] 
"; 

$lower_bracket_results = " 
[ 
[[0,0],[0,0],[0,0],[0,0]], 
[[0,0],[0,0],[0,0],[0,0]], 
[[0,0],[0,0]], 
[[0,0],[0,0]], 
[[0,0]], 
[[0,0]] 
] 
"; 

$final_bracket_results = " 
[ 
[[0,0],[0,0]], 
[[0,0]] 
] 
"; 


$json = "{\"results\" : [ {$upper_bracket_results} , {$lower_bracket_results} , {$final_bracket_results} ]}"; 

$allResults = json_decode($json, true); 
$results = current($allResults); 

$upper = $results[0]; 
$lower = $results[1]; 
$final = $results[2]; 

$all = array_merge($results[0], $results[1], $results[2]); 

$matchno = 2; 
$score1 = 3; 
$score2 = 5; 

if($matchno <= 15) 
{ 
    $bracket = $upper; 
} 
elseif($matchno >= 16 && $matchno <= 29) 
{ 
    $bracket = $lower; 
} 
elseif($matchno >= 30 && $matchno <= 32) 
{ 
    $bracket = $final; 
} 

foreach($bracket as $match => $result[0]) 
{ 
    foreach($result[0] as $match => $result) 
    { 
     $match += 1; 

     if($match == $matchno) 
     { 
      $result[0] = $score1; 
      $result[1] = $score2; 
     } 

     echo json_encode($result); 
    } 
} 


?> 
+1

Не создавайте свой собственный json. Просто используйте 'json_encode()', потому что php проанализирует его. – aldrin27

ответ

0

Имеются некоторые проблемы с этим кодом.

Вы используете $ match во внешнем цикле и внутреннем цикле. Эта переменная будет перезаписана во внутреннем цикле.

$ Результат используется за пределами петель, а также как значение в обоих циклах.

foreach($bracket as $match => $result[0]) 
{ 
    foreach($result[0] as $match => $result) 
    { 
     $match += 1; 

     if($match == $matchno) 
     { 
      $result[0] = $score1; 
      $result[1] = $score2; 
     } 

     echo json_encode($result); 
    } 
} 

Я не совсем понимаю ваш желаемый результат, но, сделав некоторые догадки, посмотрим, делает ли это то, что вы хотите.

<?php 
$upper = 
[ 
[[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[0,0]], 
[[0,0],[0,0],[0,0],[0,0]], 
[[0,0],[0,0]], 
[[0,0]] 
]; 

$lower = 
[ 
[[0,0],[0,0],[0,0],[0,0]], 
[[0,0],[0,0],[0,0],[0,0]], 
[[0,0],[0,0]], 
[[0,0],[0,0]], 
[[0,0]], 
[[0,0]] 
]; 

$final = 
[ 
[[0,0],[0,0]], 
[[0,0]] 
]; 



$matchno = 2; 
$score1 = 3; 
$score2 = 5; 

if($matchno <= 15) 
{ 
    $description = "Upper"; 
    $bracket = $upper; 
    $offset = 0; 
} 
elseif($matchno >= 16 && $matchno <= 29) 
{ 
    $description = "Lower"; 
    $bracket = $lower; 
    $offset = 16; 
} 
elseif($matchno >= 30 && $matchno <= 32) 
{ 
    $description = "Final"; 
    $bracket = $final; 
    $offset = 30; 
} 

$matchNumberInBlock = 0; 
echo "$description\n"; 
foreach($bracket as $i => $round) 
{ 
    foreach($round as $j => $match) 
    { 
     $matchNumberInBlock++; 

     if ($matchNumberInBlock + $offset == $matchno) 
     { 
      $bracket[$i][$j][0] = $score1; 
      $bracket[$i][$j][1] = $score2; 
     } 

    } 
} 
echo json_encode($bracket); 
echo "\n"; 
+0

Спасибо, это сработало просто отлично! Мне просто пришлось изменить $ matchNumberInBlock на $ matchNumberInBlock = -1; для нижнего и финального. –

+0

Я вижу проблему. Вы могли бы переместить $ matchNumberInBlock ++ после оператора if. – ryantxr

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

  • Нет связанных вопросов^_^