2017-10-21 10 views
0

Je suis en train d'essayer de séparer toutes les valeurs retournées de preg_match_all, il y a 3 valeurs. Nous obtenons tout à l'intérieur des balises fortes, des nombres dans un tableau, du texte dans un autre, et tout après que les balises fortes soient dans le troisième, mais je continue d'obtenir cette erreur que je ne veux pas ignorer.Remarque: offset non défini: 10, même avec le nombre correspondant de clés de tableau?

Ceci est l'avis: Notice: Undefined offset: 10 on line 49, et il est $saveExtra = $matches[2][$key]; tout en bas du code.

$html = "<strong>1 1/4 lb.</strong> any type of fish 
<strong>3 tsp.</strong> tarragon 
<strong>3 tsp.</strong> tomato sauce 
<strong>1 tbsp.</strong> coconut oil 
<strong>Pepper and Salt</strong>, it's optional 
<strong>2 tbsp.</strong> oil 
<strong>1/4 cup</strong> cream 
<strong>1/4 tsp.</strong> tarragon 
<strong>1/4 tsp.</strong> tomato sauce 
<strong>Salt and Pepper</strong>, it's optional too 
"; 
$variations = array('lb', 'tsp', 'tbsp', 'cup'); 

$setInfo = []; 
$arr_amount = []; 
$extra_arr = []; 
$arr_units = []; 

if(preg_match_all("/<(?:strong|b)>(.*)(?:<\/(?:strong|b)>)(.*)/", $html, $matches)) { 

    foreach($matches[1] as $amounts){ 
     preg_match_all("/^(?:[\p{Pd}.\/\s-]*[\d↉½⅓⅔¼¾⅕⅖⅗⅘⅙⅚⅐⅛⅜⅝⅞⅑⅒⅟])+/um", $amounts, $amount); 
     preg_match_all('/[a-zA-Z :]+/m', $amounts, $unit); 

     foreach($amount[0] as $amount_arr){ 
      $arr_amount[] = $amount_arr; 
     } 

     foreach($unit[0] as $units_rr){ 
      $arr_units[] = trim(strtolower($units_rr)); 
     } 

     $unit_id = array(); 
     foreach($arr_units as $key => $unit_arr){ 
      foreach($variations as $unit_var){ 
       if(strtolower(trim($unit_arr)) == $unit_var){ 
        $unit_id[] = $unit_var; 
       } 
      } 

      if(str_word_count($unit_arr) >= 2){ 
       $arr_amount[$key] = ''; 
       $unit_id[$key] = ''; 


       $saveExtra = $matches[2][$key]; 
       $matches[2][$key] = $unit_arr . $saveExtra; 
      } 

     } 
    } 
} 

Si nous print_r($arr_amount, $unit_id, $matches[2]), nous obtenons:

Array 
(
    [0] => 1 1/4 
    [1] => 3 
    [2] => 3 
    [3] => 1 
    [5] => 
    [6] => 2 
    [7] => 1/4 
    [8] => 1/4 
    [9] => 1/4 
    [10] => 
) 
Array 
(
    [0] => lb 
    [1] => tsp 
    [2] => tsp 
    [3] => tbsp 
    [5] => 
    [6] => tbsp 
    [7] => cup 
    [8] => tsp 
    [9] => tsp 
    [10] => 
) 
Array 
(
    [0] => any type of fish 
    [1] => tarragon 
    [2] => tomato sauce 
    [3] => coconut oil 
    [4] => , it's optional 
    [5] => pepper and saltpepper and saltpepper and saltpepper and saltpepper and saltpepper and salt oil 
    [6] => cream 
    [7] => tarragon 
    [8] => tomato sauce 
    [9] => , it's optional too 
    [10] => salt and pepper 
) 

Je suis dans ce domaine depuis les 2 derniers jours sans être en mesure de comprendre pourquoi je continue à obtenir Undefined offset lorsque le $key est Opportunités correspondant à cette itération actuelle.

J'ai mis en place le code sur eval, https://eval.in/883856

+0

Chaque fois que je joue avec 'preg_match_all' J'ai tendance à utiliser le drapeau' de PREG_SET_ORDER' pour les regrouper par ensemble assorti plutôt que la valeur par défaut 'PREG_PATTERN_ORDER' – Scuzzy

+1

Vous trouvez plus d'unités dans' $ arr_units' (11 items) que de correspondances dans '$ matches [2]' (10 items) – Scuzzy

+0

Je vois, juste remarqué qu'il n'y a pas de touches [4] dans les deux premiers articles. – Craig

Répondre

0

Le troisième élément $match (i.e.$match[2]) est un tableau avec 10 articles. Les tableaux PHP ont un index basé sur zéro. De mon observation, $key à un certain point est 10.

Ajouter une clause de protection contre cela comme si avant d'accéder $key à $match[2]:

if($key >= count($matches[2])) continue; 
+0

Merci pour l'aide. – Craig