2010-11-17 3 views
4

J'ai un tableau 2-D, des phrases et des mots individuels, appelés $frags, c'est `var_dump comme ceci:PHP: Undefined offset à 0, mais il est là (je pense)

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." } 
} 

quand je var_dump($frags[0]) il me donne:

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

Mais lorsque je tente d'imprimer $frags[0][0] il me donne:

Notice: Undefined de fset: 0 C: \ wamp \ www \ jpsmythe \ parser.php sur la ligne 57

Indication: Undefined offset: 0 C: \ wamp \ www \ jpsmythe \ parser.php sur la ligne 57

chaîne (3) "le"

ce qui n'a aucun sens. J'ai l'impression d'avoir tout essayé, y compris de traiter le 0 comme une corde, mais il ne le voit toujours pas. Aidez-moi?

Le code correspondant:

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

Quelle version de PHP? – cdhowie

+3

En effet, cela n'a pas de sens. Veuillez coller à nouveau le vidage en utilisant 'var_dump()' et le formatage du code de stackoverflow et collez le code réel et le message d'erreur réel. Doit être une faute de frappe ou quelque chose. – AndreKR

+0

La version est 5.3.0. Je posterai la partie la plus pertinente du code; C'est une très petite partie d'un programme beaucoup plus vaste. – garbageman14

Répondre

0

Cela fonctionne très bien pour moi ...

$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] => le [1 ] => terme [2] => 'AI' [3] => encore [4] => gère) [1] => Tableau ([0] => à [1] => fluage) [2] = > Tableau ([0] => en [1] => mon [2] => discours) [3] => Tableau ([0] => ou [1] => écriture.))

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

Array ([0] => le [1] => term [2] => 'AI' [3] => encore [4] => gère)

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

la

0

Ajout d'un

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

en haut de la fonction de l'analyseur semble l'avoir corrigé. Ce qui est juste, mais je ne suis toujours pas tout à fait sûr de l'avoir.

+0

Mettez un 'else {echo" Hey! Il semble que {$ frags [$ i]} n'a pas [0] offset (dans \ $ frags [$ i]) \ n "}' et teste où échoue-t-il;) – ssice

0

La valeur $frags est déclarée en dehors du code que vous avez collé (dans l'étendue appelante de l'appel à :: clause(), probablement). Cela arrive assez souvent dans un conflit de noms de variables. Considérez ceci:

<?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 

Cela arrive aux meilleurs d'entre nous (-:

0

sans savoir ce $parser->stopwords est qu'il est difficile de gérer votre échantillon pour voir où il est une défaillance, mais ma première observation est que vous aren ». t en passant $ frags dans parse(), vous passez des clauses $.Et il est possible que vous passiez par les boucles qui convertissent $ frags en $ clauses sans jamais rien assigner dans $ clauses [0]. Je suggérerais des clauses vardump ou print_r $ juste avant l'appel pour analyser.

De plus, je me demande quel [0] est défaillant? le premier ou le second? Façon facile de dire ... faire ceci dans l'analyse:

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]); 
} 

Cela devrait être instructif quant à l'index qui cause php à vomir.

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];