1

I am using an associative array which I initialized like this:

$img_captions = array();

Then, later in the code I am filling it in a while loop with keys and values coming in from a .txt file (every line in that .txt file contains a pair - a string - separated by '|') looking like this:

f1.jpg|This is a caption for this specific file
f2.jpg|Yea, also this one
f3.jpg|And this too for sure
...

I am filling the associative array with those data like this:

if (file_exists($currentdir ."/captions.txt"))
{
    $file_handle = fopen($currentdir ."/captions.txt", "rb");

    while (!feof($file_handle) )
    {
        $line_of_text = fgets($file_handle);
        $parts = explode('/n', $line_of_text);

        foreach($parts as $img_capts)
        {
            list($img_filename, $img_caption) = explode('|', $img_capts);
            $img_captions[$img_filename] = $img_caption;

        }
    }

    fclose($file_handle);
}

When I test that associative array if it actually contains keys and values like:

print_r(array_keys($img_captions));
print_r(array_values($img_captions));

...I see it contains them as expected, BUT when I try to actually use them with direct calling like, let's say for instance:

echo $img_captions['f1.jpg'];

I get PHP error saying:

Notice: Undefined index: f1.jpg in...

I am clueless what is going on here - can anyone tell, please?

BTW I am using USBWebserver with PHP 5.3.

UPDATE 1: so by better exploring the output of the 'print_r(array_keys($img_captions));' inside Chrome (F12 key) I noticed something strange - THE FIRST LINE OF '[0] => f1.jpg' LOOKS VISUALLY VERY WEIRD tho it looks normal when displayed as print_r() output on the site, I noticed it actually in fact is coded like this in webpage source (F12):

Array
(
    [0] => f1.jpg
    [1] => f2.jpg
    [2] => f3.jpg
    [3] => f4.jpg
    [4] => f5.jpg
    [5] => f6.jpg
    [6] => f7.jpg
    [7] => f8.jpg
    [8] => f9.jpg
    [9] => f10.jpg
)

So when I tested anything else than the 1. line it works OK. I tryed to delete completely the file and re-write it once again but still the same occurs...

DISCLAIMER Guys, just to clarify things more properly: THIS IS NOT MY ORIGINAL CODE (that is 'done completely by me'), it is actually a MiniGal Nano PHP photogalery I had just make to suit my needs but those specific parts we are talking about are FROM THE ORIGINAL AUTHOR

15
  • what's the output of print_r(array_keys($img_captions));? Commented Jan 19, 2018 at 18:26
  • Several problems with your code: Don't use while (!feof($file_handle)). '/n' should be "\n" (wrong quotes, wrong slash). Commented Jan 19, 2018 at 18:28
  • 1
    There's no need to explode on newline in the first place, since fgets() only reads one line. Commented Jan 19, 2018 at 18:29
  • 1
    I'll bet the actual problem is that there's spaces before or after the filename fields in the file. Commented Jan 19, 2018 at 18:31
  • 1
    That's the HTML entity for a BYTE ORDER MARK or BOM, save your file with no BOM in whatever editor you're using. Or it's getting there some other way. Commented Jan 19, 2018 at 20:25

2 Answers 2

2

I will recommend you to use file() along wth trim().

Your code becomes short, readable and easy to understand.

$parts= file('your text file url', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
$img_captions = [];
foreach($parts as $img_capts){
    list($img_filename, $img_caption) = explode('|', $img_capts);
    $img_captions[trim(preg_replace("/&#?[a-z0-9]+;/i","",$img_filename))] = trim(preg_replace("/&#?[a-z0-9]+;/i","",$img_caption));
}
print_r($img_captions);
Sign up to request clarification or add additional context in comments.

2 Comments

trim() is probably the solution he's missing.
@Barmar i thought exactly same, but i have a better idea than OP's code. so i posted that idea along with trim()
0

So after a while I realize there is something wrong with my .txt file itself as it:-

ALWAYS PUT SOME STRANGE SIGNS IN FRONT OF THE 1st LINE WHATEVER I DO IT WAS ALWAYS THERE EVEN WITH THE NEW FILE CREATED FROM SCRATCH (although those are UNVISIBLE unless seen as a source code on a webpage!!!)

So I decided to test it in another format, this time .log file and all of a sudden everything works just fine.

I do not know if it is just my local problem of some sort (most probably is) or something else I am not aware of.

But my solution to this was changing the file type holding the string pairs (.txt => .log) which solved this 'problem' for me.

Some other possible solution to this as @AbraCadaver said:

(Those strange signs: [0] => f1.jpg) That's the HTML entity for a BYTE ORDER MARK or BOM, save your file with no BOM in whatever editor you're using.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.