修复"警告:非法字符串偏移" - (但不丢失内容)

时间:2015-04-24 07:12:16

标签: php web-services codeigniter simplexml

  

我已经搜索了这个问题的解决方案,但没有解决我的问题。   答案表明我在使用isset之前检查数组。但我会解释它以后如何为我做这件事。

预REQ:
我从巡演中获得了一个巨大的XML文件。 travel webservice我会解析并转换为PHP数组,然后对它进行一些操作。 (主要是过滤游览)。

我的方法:
我使用SimpleXML加载xml并将其转换为PHP数组,如下所示:

$xml = file_get_contents(APPPATH."tour.xml", true);
$xmlString = htmlentity_to_xml($xml); //custom method to clean XML
$Str = simplexml_load_string($xmlString, 'SimpleXMLElement', LIBXML_NOCDATA);

//converting to array
$json = json_encode($Str);
$array = json_decode($json,TRUE);

然后我将此数组与搜索参数(cityName& date)和数组本身一起发送到fitlerTours($searchParams, $tourArray)方法。

然后使用foreach()我将浏览每个游览以查找cityName并在找到时提出标记。

问题
当我过滤日期的游览(包含cityName的游览)时,我得到了这个。

Severity: Warning
Message: Illegal string offset 'year'
Filename: controllers/tourFilter.php
Line Number: 78

警告显示forfeset'月'和' day'也。
这是我的PHP日期过滤器:(第78行是第4行)

if($flag == 1){
  if(!empty($fromDate)){
     foreach($tour['departureDates']['date'] AS $date){
        $dateDep = strtotime($date['year'] . "-" . (($date['month']) < 10 ? "0".$date['month'] : $date['month']) . "-" . (($date['day']) < 10 ? "0".$date['day'] : $date['day']));
        if(strtotime($fromDate) <= $dateDep && $dateDep <= strtotime($fromDate . "+".$range." days")){
          if($date['departureStatus'] != "SoldOut"){
             $dateFlag = 1;
          }
        }
     }
  }
  else{
     $dateFlag = 1;
  }
  $flag = 0;
}

if($dateFlag == 1){//Collect tours which contain the keyword & dates to $response array
   $responseArray[] = $tour;
   $dateFlag = false; //Reset Flag
}

这是XML的片段:

...
<departureDates>
        <date>
            <day>7</day>
            <month>1</month>
            <year>2016</year>
            <singlesPrice>12761</singlesPrice>
            <doublesPrice>9990</doublesPrice>
            <triplesPrice>0</triplesPrice>
            <quadsPrice>0</quadsPrice>
            <shipName/>
            <departureStatus>Available</departureStatus>
        </date>
        <date>
            <day>8</day>
            <month>1</month>
            <year>2016</year>
            <singlesPrice>12761</singlesPrice>
            <doublesPrice>9990</doublesPrice>
            <triplesPrice>0</triplesPrice>
            <quadsPrice>0</quadsPrice>
            <shipName/>
            <departureStatus>SoldOut</departureStatus>
        </date>
</departureDates>
...

现在,如果我使用我通过搜索找到的解决方案,检查isset()是否正确设置了数组,它不会返回true并且不执行第78行并且数据丢失。但我需要数据。

只有我搜索的关键字才会出现这种情况 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

错误表明$date var在某些时候被检测为字符串......

  

可以通过指定来访问和修改字符串中的字符   字符串使用后所需字符的从零开始的偏移量   方阵数括号,如$ str [42]。将字符串视为数组   为此目的的字符。   See here

所以试试这个:

    if(is_array($date)){
        $dateDep = strtotime($date['year'] . "-" . (($date['month']) < 10 ? "0".$date['month'] : $date['month']) . "-" . (($date['day']) < 10 ? "0".$date['day'] : $date['day']));
        if(strtotime($fromDate) <= $dateDep && $dateDep <= strtotime($fromDate . "+".$range." days")){
          if($date['departureStatus'] != "SoldOut"){
             $dateFlag = 1;
          }
        }
    }
    else {
        //If this is not an array what is it then?
        var_dump($date);
    }