Элементы не возвращены из массива - PullRequest
1 голос
/ 28 марта 2011

Я задал вопрос о том же коде, но затерялся в переводе

Вот к чему сводится вопрос.Я проверяю, является ли переменная certrain массивом, тогда я хочу получить из нее элемент, но не возвращает значения.Что происходит?

РЕДАКТИРОВАТЬ: я добавляю код, который объясняет, откуда исходит строка.Это гостевая книга, где мне нужно найти решение, которое НЕ является базой данных сессионной переменной.Это то, что требует мой курс;

   $file="gb_berichten.txt";            
$datum = date("d-m-Y");

$bericht = "<p><b>naam: </b>$_POST[naam] <br>
            <b>email: </b>$_POST[email] <br>
            <b>onderwerp: </b>$_POST[subj]<br><br>
            <b>bericht: </b>$_POST[bericht]<br>
            <b>verzonden op: </b> $datum
            </p>
            <hr/>
            ";

        if (is_writable ($file)){
            $fp= fopen($file, "a")
                or die ("kan de file niet openen<br>");
                fwrite ($fp, $bericht);
                fclose($fp);
            }//end if writable

        else {
            print ("bestand $file is niet beschikbaar voor schrijven<br>");
            }   

        if (is_readable($file)){
            $fp = fopen($file, "r");
            //$tekst = fread($fp, filesize($file));
            $inhoud = file_get_contents($file);
            $berichten =  implode(' ', array_reverse(explode("<hr/>", $inhoud)));
            fclose ($fp); 
            print($berichten);
            }

        else {
            print("niet mogelijk om bestand te lezen");
            } 




    //check of $berichten een string is
    if (is_string($berichten)){
       print ("string ok"); 
    } else{
       print ("string niet ok");} 
       // returns string ok 

       //convert back to array  
       $berichtenArr =  explode("<hr/>", $berichten);
       if (is_array($berichtenArr )) {
          print("<p style='color:red'>Array OK<p>");
       } else {
          print("<p style='color:red'>Array not OK<p>");
       }
       //returns Array OK

       $secondElem = $berichtenArr[1];
       print("<p style='color:red'>second element is: $secondElem<p>"); // returns no value

       $aantalBer = count($berichtenArr);
       print("<p style='color:red'>amount of messages   is: $aantalBer<p>"); //returns 1
    }

Ответы [ 4 ]

1 голос
/ 28 марта 2011

Вы сделали explode("<hr/>"), но в одном из ваших комментариев в другом месте вы утверждаете, что ваша строка имеет multiple <hr /> elements.

Можете ли вы найти проблему там?

Я дам вам подсказку: <hr/> - это не то же самое, что <hr />.

Возможно, вам необходимо изменить explode(), чтобы учесть оба.

Также возможно, что у вас может быть <hr> в качестве другой допустимой возможности. (На самом деле, существует гораздо больше возможностей, чем это, поскольку допустимо, чтобы тег <hr> содержал атрибуты id, class и style, все из которых будут пропущены простым explode().

Если вы хотите использовать все действительные возможности, вы можете использовать что-то вроде preg_split(). (обратите внимание, хотя я и предлагаю, я должен добавить, что использование регулярных выражений для сопоставления с образцом в HTML обычно считается плохой формой. Но так как вы просто ищете простой тег <hr>, это должно быть возможно сделать достаточно хорошая работа с preg_match() без необходимости усложнять шаблон сопоставления).

0 голосов
/ 28 марта 2011

Согласно вашему коду ваш массив содержит только 1 элемент, поэтому он находится в индексе 0.

, когда вы печатаете значение массива, вы ссылаетесь на индекс 1.

$secondElem = $berichtenArr[0];

а также проверьте структуру массива, напечатав его print_r($berichtenArr)

0 голосов
/ 28 марта 2011

Я думаю, что с вашей логикой что-то не так: функция explode() принимает строку в качестве ввода, и в предыдущих строках вы убедились, что это , а не строка, поэтому код не будет работать .

Редактировать: Извините, я пропустил первое закрытие } (кажется, слишком много ...), но вам все еще нужно обернуть свое первое if утверждение вокруг всех остальных ваш код, поскольку вы не можете продолжить с explode, если результат первого if говорит вам, что это не строка.

0 голосов
/ 28 марта 2011

У вас есть только один элемент в вашем массиве. Вот почему вы не получаете значения, когда пытаетесь получить второй элемент.

Добавить

print_r($berichtenArr);

и все будет ясно.

...