2010-11-17 1 views
4

Так что я получил массив 2-D, фраз и отдельных слов, называется $frags, что `var_dump как так:PHP: Undefined смещение 0, но там (я думаю)

array(4) { 
[0]=> array(5) { 
    [0]=> string(3) "the" [1]=> string(4) "term" [2]=> string(4) "'AI'" [3]=> string(5) "still" [4]=> string(7) "manages" } 
[1]=> array(2) { 
    [0]=> string(2) "to" [1]=> string(5) "creep" } 
[2]=> array(3) { 
    [0]=> string(4) "into" [1]=> string(2) "my" [2]=> string(6) "speech" } 
[3]=> array(2) { 
    [0]=> string(2) "or" [1]=> string(8) "writing." } 
} 

когда я var_dump($frags[0]) это дает мне:

array(5) { 
    [0]=> string(3) "the" [1]=> string(4) "term" [2]=> string(4) "'AI'" [3]=> string(5) "still" [4]=> string(7) "manages" } 

Но когда я пытаюсь напечатать $frags[0][0] это дает мне:

Примечание: Не определено из FSet: 0 в C: \ WAMP \ WWW \ jpsmythe \ parser.php на линии 57

Примечание: Undefined смещение: 0 в C: \ WAMP \ WWW \ jpsmythe \ parser.php на линии 57

строка (3) «the»

который не имеет смысла. Я чувствую, что я пробовал все, включая обработку 0 как строку, но она все еще не видит этого. Помогите?

Соответствующий код:

private function clause($frags) { 
    // set the parser through the control hub 
    $controller = Controller::getInstance(); 
    $parser = $controller->parser; 
    $parser->init(); 

    // take the $frags array from elsewhere in the program 
    // this $frags is actually punctuation-separated fragments of a sentence, not the same as the $frags array with which I'm having problems now 
    $i = 0; 
    $clauses = array(); 
    //run through the punctuated $frags array 
    while ($i < count($frags)) { 
     $pos = array(); 
     $num = 0; 
     $p = 0; 
// separated each punc'ed fragment into smaller fragments separated by stopwords   
     while ($p < count($frags[$i])) { 
      if (array_key_exists($frags[$i][$p], $parser->stopwords)) { 
       $pos[] = $p; 
       $clauses[$num] = array(); 
       $num ++; 
      } 
      $p ++; 
     } 
     $pos[] = count($frags[$i]); 

     $num = 0; 
     $j = 0; 
     if (count($pos) > 0) { 
      while ($j < count($pos)) { 
       $stop = FALSE; 
       $k = $pos[$j]-1; 
       while ($k >= 0 && !$stop) { 
        if (array_key_exists($frags[$i][$k], $parser->stopwords)) 
         $stop = TRUE; 
        $clauses[$num][] = $frags[$i][$k]; 
        $k --; 
       } 

       $clauses[$num] = array_reverse($clauses[$num]); 
       $num ++; 
       $j ++; 
      } 

      //send the array of stopped fragments to the parser 
      $parser->parse($clauses); 
      //$controller->setResponse($clauses); 
     } 
     $i ++; 
    } 
} 

function parse($frags) { 
    $i = 0; 

    // more code here, commented out for the time being 
    // below, send response to control hub for output 
    $controller = Controller::getInstance(); 
    $controller->setResponse($frags[$i][0]); 
} 
+0

Какая версия PHP? – cdhowie

+3

Действительно, это не имеет смысла. Вставьте дамп снова, используя 'var_dump()' и форматирование кода stackoverflow и, пожалуйста, вставьте фактический код и фактическое сообщение об ошибке. Должна быть опечатка или что-то в этом роде. – AndreKR

+0

Версия 5.3.0. Я отправлю наиболее релевантную часть кода; это очень малая часть гораздо более масштабной программы. – garbageman14

ответ

0

Это прекрасно работает для меня ...

$frags = array(array ('the', 'term', '\'AI\'', 'still', 'manages'), array ('to', 'creep'), array ('into', 'my', 'speech'), array ('or', 'writing.')); 

print_r($frags); 

Array ([0] => Array ([0] => кнопки [1 ] => term [2] => 'AI' [3] => еще [4] => управляет) [1] => Массив ([0] => до [1] => ползучесть) [2] = > Array ([0] => в [1] => my [2] => речь) [3] => Массив ([0] => или [1] => запись.))

print "<br>"; 
print_r($frags[0]); 

Array ([0] => кнопку [1] => Термин [2] => 'МА' [3] => еще [4] => управляет)

print "<br>"; 
print $frags[0][0]; 

0

Добавление

if (isset($frags[$i][0])) {

в верхней части функции парсера, похоже, исправил ее. Это справедливо, но я все еще не совсем уверен, что понял.

+0

Положите 'else {echo" Привет! Кажется, что {$ frags [$ i]} не имеет смещения [0] (в \ $ frags [$ i]) \ n "}' и проверяет, где он не работает;) – ssice

0

Значение $frags указано вне кода, который вы вложили (возможно, в сферу вызова call to ::(). Это происходит довольно часто в конфликте имен переменных. Рассмотрим это:

<?php 
$frags = array('apple','orange'); 
// other stuff 
while ($frags = $query->next()) { 
    //... 
} 
// the last value returned from $query->next() was false in this example 
// .. more stuff 

$this->clause($frags); // actually passes false, not the apple,orange array 

Это случается с лучшими из нас (-:

0

Не зная, что $parser->stopwords это трудно запустить образец, чтобы увидеть, где это провал Но мое первое наблюдение состоит в том, что вы Арен». t передавая $ frags в parse(), вы передаете $ clauses.Возможно, вы пройдете через циклы, которые конвертируют $ frags в $ clauses, не присваивая ничего в $ clauses [0].

Я предлагаю вам предложения vardump или print_r $ перед вызовом синтаксического анализа.

Кроме того, я сомневаюсь, что [0] не работает? первый или второй? Простой способ рассказать ... сделайте это в синтаксическом анализе:

function parse($frags) { 
    $i = 0; 

    // more code here, commented out for the time being 
    // below, send response to control hub for output 
    $controller = Controller::getInstance(); 

    if (!isset($frags[$i])) echo "failure at ".__LINE__." [$i]\n"; 
    if (!isset($frags[$i][0])) echo "failure at ".__LINE__." [$i][0]\n"; 

    $controller->setResponse($frags[$i][0]); 
} 

Это должно быть информативным относительно того, какой индекс вызывает pp.

0
$grabs = array(0=> array(0=>"the",1=>"term",2=>"AI",3=> "still",4=> "manages"), 
       1=> array(0=>"to",1=>"creep"), 
       2=> array(0=>"into", 1=>"my" ,2=>"speech"), 
       3=> array(0=> "or",1=>"writing") 
       ); 
echo $grabs[0][0]; 
Смежные вопросы