【问题标题】:Uninitialized string offset: 5未初始化的字符串偏移量:5
【发布时间】:2014-01-09 10:59:25
【问题描述】:

我正在尝试使用表单创建一些已发布到控制器的输入数组,但是当我尝试将该数组发送到我的视图时,当我尝试使用 $ 时,我收到错误未初始化的字符串偏移量:5数组 [5],我将把我的代码放在下面以进行澄清。顺便说一句,我正在使用 Kohana。

控制器:

    <?php

defined('SYSPATH') or die('No direct script access.');

class Controller_Handmatigconvert extends Controller_Base_Main {

    public function action_index() {
        $this->template->content = View::factory('handmatigconvert')    
                ->bind('agenda',$agenda);
        $this->template->title = 'iCalender generator';
        //inputs that have been posted on form
        $agenda=array($_POST['agendanaam'],$_POST['agendaomschrijving'],$_POST['onderdeelnaam'],$_POST['onderdeelomschrijving'],$_POST['begintijd'],$_POST['eindtijd'],$_POST['locatie'],$_POST['samenvatting']);

        var_dump($agenda[5]);
    }
}

查看:

<?php
//Converter van database gegevens naar .ics bestand
//zodat je de evenementen uit de database op je smartphone's agenda kunt bekijken
//Wanneer het script succcesvol gelopen heeft, wordt een er een ics bestand gegenereert.
//dit bestand kun je plaatsen op de webhost, zodat je via je telefoon alleen de url ervan hoeft in te voeren
//bijvoorbeeld: webcal://www.kj.nu/Agenda.ics
//variablen

echo $agenda[1];

$uniekid = "";
$bestandsnaam = "";
$bestandspad  = "";
$tijdzone = "Europe/Amsterdam";

//functie class includen
require_once('assets/php/iCalcreator.class.php');                  //class requiren
//tijdzone bepalen

$config = array( "unique_id" => "".$uniekid."",                    // Unieke ID zetten
                                                           // Deze wordt gebruikt wanneer er geen ID bij een event is meegegeven
                 "TZID"      => $tijdzone );                     // TZID de waarde van de timezone variable geven
//nieuwe agenda aanmaken

$v = new vcalendar( $config );                             // Nieuw agenda object aangeven
$v->setProperty( "method", "PUBLISH" );                    // required of some calendar software
$v->setProperty( "x-wr-calname", "Agenda" );               // Naam van agenda aangeven
$v->setProperty( "X-WR-CALDESC", "Agenda omschrijving" );  // Omschrijving van agenda aange
$v->setProperty( "X-WR-TIMEZONE", $tijdzone );                   // Timezone uit variable zetten(+1 in dit geval)
$xprops = array( "X-LIC-LOCATION" => $tijdzone );                // Locatie aangeven
iCalUtilityFunctions::createTimezone( $v, $tijdzone, $xprops );  // create timezone component(-s) opt. 1
var_dump($agenda);
//nieuw onderdeel in agenda aanmaken
$vevent = & $v->newComponent( "vevent" );                  // Nieuw onderdeel object aanmaken
foreach ( $agenda as $agenda){
    $begintijd = $agenda[5];
    $eindtijd = $agenda[4];
    //converten van tijd string naar aparte onderdelen indien nodig
    //dit doen we doormiddel van een substring, de manier waarop substring gebruikt kan verschillen ivm de indeling van de tijdstring(in ons geval YYYY-MM-DD: HH-MM) 
    $bjaar   =  substr($eindtijd, 0, 4); //0,4          houdt in dat de eerste 4 tekens van de string worden gescheden, YYYY in dit geval
    $bmaand  =  substr($eindtijd, 6, 8); //6,8      houdt in dat de 6 tm 8 tekens van de string worden gescheden, MM in dit geval
    $bdag    =  substr($eindtijd, 10, 12); //10,12      houdt in dat de 10 tm 12 tekens van de string worden gescheden, DD in dit geval
    $buur    =  substr($eindtijd, 13, 14); //13,14      houdt in dat de 13 tm 14 tekens van de string worden gescheden, HH in dit geval
    $bminuut =  substr($eindtijd, 16, 18); //16,18  houdt in dat de 16 tm 18 tekens van de string worden gescheden, MM in dit geval
    //$btotaletijd = $bjaar + $bmaand + $bdag + $buur + $bminuut;   alle delen weer bij elkaar
    $sjaar   =  substr($begintijd, 0, 4); //0,4             houdt in dat de eerste 4 tekens van de string worden gescheden, YYYY in dit geval
    $smaand  =  substr($begintijd, 6, 8); //6,8         houdt in dat de 6 tm 8 tekens van de string worden gescheden, MM in dit geval
    $sdag    =  substr($begintijd, 10, 12); //10,12         houdt in dat de 10 tm 12 tekens van de string worden gescheden, DD in dit geval
    $suur    =  substr($begintijd, 13, 14); //13,14         houdt in dat de 13 tm 14 tekens van de string worden gescheden, HH in dit geval
    $sminuut =  substr($begintijd, 16, 18); //16,18     houdt in dat de 16 tm 18 tekens van de string worden gescheden, MM in dit geval

    //start van evenement aangeven
    $vevent->setProperty( "dtstart", array( "year"  => $sjaar
                                          , "month" => $smaand
                                          , "day"   => $sdag
                                          , "hour"  => $suur
                                          , "min"   => $sminuut
                                          , "sec"   => "00" ));
    //einde van evenement aangeven
    $vevent->setProperty( "dtend",   array( "year"  => $bjaar
                                          , "month" => $bmaand
                                          , "day"   => $bdag
                                          , "hour"  => $buur
                                          , "min"   => $bminuut
                                          , "sec"   => "00" ));
    $vevent->setProperty( "LOCATION",    $onderdelen->location );       // Naam van locatie – hoofdletter gevoelig
    $vevent->setProperty( "summary",     $onderdelen->summary );              //samenvatting
    $vevent->setProperty( "description", $onderdelen->description );     //omschrijving van onderdeel
    $vevent->setProperty( "comment",     $onderdelen->comment ); //comment aan onderdeel toevoegen
    $vevent->setProperty( "attendee",    $onderdelen->attendee ); //andere personen in dit onderdeel
}; 
//tijdzone toevoegen aan .ics bestand
iCalUtilityFunctions::createTimezone( $v, $tijdzone, $xprops); 
//bestandsdirectory bepalen en .ics opslaan
$config = array("filename" => "".$agendanaam.".ics" );
$v->setConfig( $config );                                 // set directory and file name
$v->saveCalendar();  

//url van de website ophalen en http:// vervangen door webcal://  
$base_url = URL::site(NULL, TRUE);
//base url geeft een site met http:// ervoor, dit vervangen we door webcal://
$new_string = str_replace("http://", 'webcal://', $base_url);
$URL = "".$new_string."/".$agendanaam.".ics";
echo "Voor de volgende URL in bij uw agenda App";
echo "<html><br></html>";
echo $URL;
?>

转储

   array(8) { [0]=> string(4) "Test" [1]=> string(4) "Test" [2]=> string(4) "Test" [3]=> string(4) "Test" [4]=> string(16) "2014-01-09:19:00" [5]=> string(16) "2014-01-09:21:00" [6]=> string(4) "Test" [7]=> string(4) "Test" }

【问题讨论】:

  • 错误发生在哪一行?
  • $begintijd = $agenda[5];
  • foreach ($agenda as $agenda) 是非常糟糕的风格。为什么对原始数组和迭代使用相同的变量? $agenda[5] 是指原始数组还是子数组?
  • 您推荐使用什么? $agenda var 是在控制器中创建的数组
  • $agenda是多维数组吗?您的 foreach 循环期望它是。

标签: php html kohana


【解决方案1】:

您的议程不是您应该迭代的数组。删除foreach 循环,只需使用循环体中的代码处理一次$agenda。

我还建议您重新设计控制器,将$agenda 设置为关联数组或对象。数值数组应用于统一数据,关联数组应用于非线性相关数据的集合。

【讨论】:

    【解决方案2】:

    这会破坏你的数组$agenda:

    foreach ( $agenda as $agenda){
    
    }
    

    将值重命名为新名称:

    foreach ($agenda as $value) {
    
    }
    

    【讨论】:

      【解决方案3】:

      我可能是错的,但不是:

      foreach ( $agenda as $agenda){
      

      覆盖第一个 $agenda 变量,因此在循环中 $agenda 实际上是 $_POST['begintijd'] 使得 $agenda[5] 不再指向您所期望的。

      【讨论】:

        猜你喜欢
        • 2019-08-11
        • 2017-05-10
        • 1970-01-01
        • 1970-01-01
        • 2016-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多