2015-06-10 52 views
0

在我的彩票项目中,我有5张门票,您可以在其中选择数字并购买。问题是,如果你为了买他们...例如,你只能买到门票:Symfony2未定义偏移:0彩票项目错误

Ticket 1 Ticket 2 Ticket 3 Ticket 4 Ticket 5 

如果添加号码票1,然后其他人它的工作原理...如果你跳过ticket 1并添加数字给其他人,当你试图购买你得到这个错误:

ContextErrorException:注意:未定义偏移量:0在C:\ wamp \ www \ Digidis \ front \ src \ MediaparkLt \ UserBundle \ Service \ MoneyManager.php line 313

完整堆栈:

array('cartProduct' => array('title' => 'EUROMILLONES', 'price' => '2.35', 'product' => '2', 'ticket_id' => '1433921783_19792', 'numbers' => '8,13,14,17,37', 'stars' => '4,7', 'betslip' => '{"duration":"1","subscription":"false","jsPrice":"235","type":"simple","numbers1":"0,0,0,0,0","numbers2":"8,13,14,17,37","numbers3":"0,0,0,0,0","numbers4":"0,0,0,0,0","numbers5":"0,0,0,0,0","stars1":"0,0","stars2":"4,7","stars3":"0,0","stars4":"0,0","stars5":"0,0","dayOfWeek":"3"}', 'is_syndicate' => false, 'draw' => object(DateTime)), 'product' => object(Product), 'user' => object(User), 'reference' => null, 'paymentResult' => 'Authorised', 'bets' => object(stdClass), 'individualBets' => array(), 'tickets' => array(array('numbers' => '8,13,14,17,37', 'stars' => '4,7')), 'k' => '0', 't' => array('numbers' => '0,0,0,0,0', 'stars' => '0,0'), 'is_ticket_filled' => false, 'week_id' => array(array('ticketId' => '7005')), 'g' => '0', 'lastId' => '7005', 'purchase' => object(Purchase), 'price' => '2.35', 'bet' => object(Bet), 'euromillonesBet' => object(EuromillonesBet), 'drawDate' => array(object(DrawDate)), 'j' => '0')) in C:\wamp\www\Digidis\front\src\MediaparkLt\UserBundle\Service\MoneyManager.php line 313 

正如你可以看到第一张票,它是空的(或0),这就是为什么它会导致错误...我怎样才能让它跳过空的票?

这里是哪里发生错误的控制器:

$bets = json_decode($cartProduct['betslip']); 

     $individualBets = array(); 

     $tickets = array(
      array('numbers' => $bets->numbers1, 'stars' => $bets->stars1), 
      array('numbers' => $bets->numbers2, 'stars' => $bets->stars2), 
      array('numbers' => $bets->numbers3, 'stars' => $bets->stars3), 
      array('numbers' => $bets->numbers4, 'stars' => $bets->stars4), 
      array('numbers' => $bets->numbers5, 'stars' => $bets->stars5) 
     ); 

     if ($bets->type === 'simple') { 
      foreach ($tickets as $k => $t) { 
       $is_ticket_filled = ((int) str_replace(',', '', $t['numbers'])) > 0; 
       if (!$is_ticket_filled) { 
        unset($tickets[$k]); 
       } 
      } 
     } else if ($bets->type === 'multiple') { 
      $tickets = array(array('numbers' => $bets->numbers1, 'stars' => $bets->stars1)); 
     } 

     $week_id = null; 
     for ($k = 0; $k < (count($tickets)); $k++) { 
      for ($g = 0; $g < $bets->duration; $g++) { 
       if (!isset($week_id[$g])) { 
        $week_id[$g] = $this->entityManager->getRepository('MediaparkLtLotteryBundle:Bet')->getLastTicketId(); 

        if ($week_id[$g]) { 
         $week_id[$g]['ticketId'] ++; 
        } else { 
         $week_id[$g]['ticketId'] = 0; 
        } 
       } 

       $lastId = $week_id[$g]['ticketId']; 

       $purchase = new Purchase(); 
       $purchase->setUser($user); 
       $purchase->setDrawDate($cartProduct['draw']); 
       $purchase->setProduct($product); 
       $purchase->setReference($reference); 
       $price = $cartProduct['price']; 

       $bet = new Bet(); 

       if ('eurojackpot' == $product->getAlias()) { 
        $euromillonesBet = new EurojackpotBet(); 
       } else { 
        $euromillonesBet = new EuromillonesBet(); 
       } 

       $drawDate = $this->entityManager->getRepository('MediaparkLtLotteryBundle:DrawDate')->findByDrawDate($cartProduct['draw']); 
       if (!$drawDate) 
        die('no draw date found ' . $cartProduct['draw']->format('Y-m-d H:i:s')); 

       $bet->setDrawDate($drawDate[0]); 
       $bet->setTicketId($lastId); 

       if (strtoupper($paymentResult) === 'AUTHORISED') { 
        $bet->setStatus(BetStatus::AUTHORISED); 
       } else { 
        $bet->setStatus(BetStatus::FAILED); 
       } 

       $bet->setWinnings(0); 

       $euromillonesBet->setBet($bet); 
/// LINE 313 ABOVE!!!!!!! 
       $numbers = $this->getNumbersArray($tickets[$k]['numbers']); 

       $j = 0; 
       foreach ($numbers as $number) { 
        $j++; 
        $name = 'setN' . $j; 
        $euromillonesBet->$name($number); 
       } 

       $numbers = $this->getNumbersArray($tickets[$k]['stars']); 
       $euromillonesBet->setS1($numbers[0]); 
       $euromillonesBet->setS2($numbers[1]); 

       $euromillonesBet->setAmountOfStars(Bet::NUMBER_OF_STARS); 

       $purchase->addBet($bet); 

       $purchase->setPricePaid($price); 

       if (strtoupper($paymentResult) === 'AUTHORISED') { 
        $purchase->setStatus(PaymentStatus::AUTHORISED); 
       } else { 
        $purchase->setStatus(PaymentStatus::FAILED); 
       } 

       if ($bets->subscription === "true") { 
        $contract = new PurchaseContract(); 
        $contract->setAccumulatedWinnings(0); 
        $contract->setCancellationDate(null); 
        $contract->setFirstDrawDate($purchase->getDrawDate()); 
        $contract->setLastRenewedDate($purchase->getDrawDate()); 
        $contract->setNextRenewalFirstDrawDate($purchase->getDrawDate()); 
        // $contract->setPurchase($purchase); 
        $contract->setStatusPurchaseContract(1); 
        $contract->setWeeks(1); 
        $purchase->setPurchaseContract($contract); 
        $this->entityManager->persist($contract); 

       } 

       if ($g == 0) 
        $individualBets[] = $euromillonesBet; 

       $this->entityManager->persist($bet); 
       $this->entityManager->persist($euromillonesBet); 
       $this->entityManager->persist($purchase); 

       $this->entityManager->flush(); 
      } 
     } 
     return $individualBets; 
    } 

回答

0

从我看到你的对象投注类型设置为"type":"simple"numbers1":"0,0,0,0,0"

$is_ticket_filled = ((int) str_replace(',', '', $t['numbers'])) > 0; 
//(int) 00000 = 0 
if (!$is_ticket_filled) { 
    unset($tickets[$k]); 
} 

导致问题,因为没有设置呢不重置数组索引。 http://ideone.com/5q74Wv

再后来你遍历索引时重复使用使用unset($tickets[$k])

if ($bets->type === 'simple') { 
    //... 
    $tickets = array_values($tickets); 
} 

或检查车票后存在for($k=0; $k < count($tickets); $k++)

而应该重订阵列

$ticketCount = count($tickets); 
for ($k=0; $k < $ticketCount; $k++) { 
    if (false === isset($tickets[$k]) { 
     continue; 
    } 
    //... 
} 

或者更容易,使用迭代现有的门票数组而不是for

foreach ($tickets as $k => $ticket) { 
    //... 
} 

然后只用$ticket因为$k,不使用其他任何地方改变$tickets[$k]

+0

显然只有foreach的例子完美运行!谢谢你,先生! – Dominykas55