2

I am a little be a newbie in PHP (I have much experience in other programming languages like C# etc). So from experience in OOP, i am almost sure that this can be done also in PHP. Here is the question and problem. I am writting script thats going to export some html code. Here is example. I have folder on server with images of fruits. For example folder holds next images: strawberry.jpg, apple 1.jpg, apple 2.jpg, peach.jpg, bannana 1.jpg, bannana 2.jpg, pear.jpg. I am already written code thats working perfect but I want to be more advanced

<?php
$files = glob('./images/fruits/*.*');
foreach($files as $file) {
    $filename = pathinfo($file);
	$filepath1 = pathinfo($file, PATHINFO_BASENAME);
	$filepath2 = "images/logotipi/fruits/".$filepath1;
    echo '{slider <strong>'.$filename['filename'].'</strong>|blue}';
	echo '<br>';
	echo '{tip';
	echo "<img src=\"".$filepath2."\">";
	echo '}';
	echo "<img src=\"".$filepath2."\" ";
	echo 'width="100" height="100" />{/tip}';
	echo '<br>';
}
?>

So what I want. As you see my output will be

{slider **strawberry**|blue}
{tip <img src="images/fruits/strawberry.jpg" />}<img src="images/fruits/strawberry.jpg" width="100" height="100" />{/tip}
{slider **apple 1**|blue}
{tip <img src="images/fruits/apple 1.jpg" />}<img src="images/fruits/apple 1.jpg" width="100" height="100" />{/tip}
{slider **apple 2**|blue}
{tip <img src="images/fruits/apple 2.jpg" />}<img src="images/fruits/apple 2.jpg" width="100" height="100" />{/tip}

...

And etc for each image. I want next i want to my output for each this slider that apple be in that slide for example. I want to my output be like this:

 {slider **strawberry**|blue}
    {tip <img src="images/fruits/strawberry.jpg" />}<img src="images/fruits/strawberry.jpg" width="100" height="100" />{/tip}
    {slider **apple**|blue}
        {tip <img src="images/fruits/apple 1.jpg" />}<img src="images/fruits/apple 1.jpg" width="100" height="100" />{/tip}
        {tip <img src="images/fruits/apple 2.jpg" />}<img src="images/fruits/apple 2.jpg" width="100" height="100" />{/tip}

... So as you see I want to check names which are strings in string array of filenames. If i have more categories like apples, or bannanas, the names always end with number 1,2,3 etc. How can be done in php?

7
  • Use the basename function to get the filename part of the path and remove the .jpg suffix, and explode() to get the part before the space. Commented Oct 2, 2014 at 14:50
  • You dont understanded what I want to do. You can se that part I already done. I want to check strings in array of strings that are filenames. To get output as I described. Commented Oct 2, 2014 at 14:51
  • Then your question isn't clear enough. It looks to me like you want to get apple from images/fruits/apple 1.jpg, and show that in the slider heading. Commented Oct 2, 2014 at 14:52
  • Practiuclary. I want to check last char of string if the char is number and rest chars in string are the same as some other string in array that holds last char in number do that and that else do something else...In short Commented Oct 2, 2014 at 14:54
  • Why just the last char of the string? What if it's apple 10.jpg? Commented Oct 2, 2014 at 14:55

3 Answers 3

2

You might try to preg_match() the filename to grab the category. You can modify the regular expression to fit your desired pattern.

$lastCategory = null;

foreach($files as $file) {

    // adjust this regular expression pattern to fit your needs
    preg_match("/(\w+)\s\d.\w+/", $file, $matches);
    $filename = $matches[0];
    $category = $matches[1];

    // do we have a new category?
    if ($category !== $lastCategory) {
        echo '{slider <strong>' . $category . '</strong>|blue} <br>';
        $lastCategory = $category;
    }

    echo '{tip <img src="' . $file . '"> }';
    echo '<img src="' . $file . '" width="100" height="100" />';
    echo '{/tip} <br>';  

}

And i doubt that you can adjust the regexp :D So "apple green 1.jpg" -> (\w+|\w+\s\w+)\s\d.\w+

Sign up to request clarification or add additional context in comments.

3 Comments

I have one little question more. Not to open another question. Do you know how encoding of path and images functioning. I am from Serbia so if my picture is caled kruška.jpg (kruška is pear in translate) isnt working i get this for slider name kruÅ¡ka, and the path to image is image/fruits/kruÅ¡ka.jpg and isnt loaded? Is there solution. Also must working for other Serbian characters like Č,č,Ć,ć,Ž,ž
That's odd! If you want to be safe, go with 7-bit ASCII. Read about urlencode() and utf8_encode(). Set utf8 header for the page. More: stackoverflow.com/a/1556989/1163786
I looked now, in export txt file everything is ok, but on echo isnt :) Very odd. Oh wheel mystery. To me its important export file.
2

If I understand you want to group your images in the format provide for your slider, that is actually simple, just extract the slider header from the file name and then put it as the key of its array to group the images:

<?
// Serialize data ------------------------------------>
function clearHeader($filename) {
    // Remove extension
    // $rf = pathinfo($file, PATHINFO_BASENAME); # This will not work in my example as I don't have the images
    $rf = explode('.', $filename);
    array_pop($rf);
    $hd = $rf[0];
    // Remove numbers
    $hd = preg_replace('/\s?\d+/', '', $hd);
    // Replace spaces for underscores
    $hd = str_replace(' ', '_', $hd);
    // Return the header name
    return $hd;
}

$files = array('strawberry.jpg','apple 1.jpg','apple 2.jpg','peach.jpg','bannana 1.jpg','bannana 2.jpg','pear.jpg');
/*
// This file iterator is better than glob()
$scan = new RecursiveDirectoryIterator(__DIR__ . '/images/fruits/');
foreach(new RecursiveIteratorIterator($scan) as $file) {
    if(@!is_array(getimagesize($file))){
        $files[] = pathinfo($file)['basename'];
    }
}
*/
foreach ($files as $filename) {
    $slider[ clearHeader($filename) ][] = $filename;
}

// Display data -------------------------------------->
foreach ($slider as $header => $files) {
    $slider_line = array();
    $slider_line[] = "{slider **{$header}**|blue}";
    foreach ($files as $file) {
        $slider_line[] = "{tip <img src=\"images/fruits/{$file}\" />}<img src=\"images/fruits/{$file}\" width=\"100\" height=\"100\" />{/tip}";
    }
    echo implode(PHP_EOL, $slider_line) . PHP_EOL;
}

That would print (Codepad example):

{slider **strawberry**|blue}
{tip <img src="images/fruits/strawberry.jpg" />}<img src="images/fruits/strawberry.jpg" width="100" height="100" />{/tip}
{slider **apple**|blue}
{tip <img src="images/fruits/apple 1.jpg" />}<img src="images/fruits/apple 1.jpg" width="100" height="100" />{/tip}
{tip <img src="images/fruits/apple 2.jpg" />}<img src="images/fruits/apple 2.jpg" width="100" height="100" />{/tip}
{slider **peach**|blue}
{tip <img src="images/fruits/peach.jpg" />}<img src="images/fruits/peach.jpg" width="100" height="100" />{/tip}
{slider **bannana**|blue}
{tip <img src="images/fruits/bannana 1.jpg" />}<img src="images/fruits/bannana 1.jpg" width="100" height="100" />{/tip}
{tip <img src="images/fruits/bannana 2.jpg" />}<img src="images/fruits/bannana 2.jpg" width="100" height="100" />{/tip}
{slider **pear**|blue}
{tip <img src="images/fruits/pear.jpg" />}<img src="images/fruits/pear.jpg" width="100" height="100" />{/tip}

7 Comments

Yes thats that. Sorry as I written in question I am newbie in PHP so I dont know what are exactly functions and declaration and that stuff in PHP, but I know very well OOP. Thanks, you are also been helpful I gona also, use as backup this code also.
@MorsViolenta I've edited my answer. Use the file iterator below the $files array to match all image file regardless of its filename (Serbian characters support)
Man you are king! :) Thanks so much.
Its not working :( "Parse error: syntax error, unexpected '[' in scriptgal.php on line 20"
Oh, you are using and older version of php. Split it in two lines. $pathinfo = pathinfo($file); $files[] = $pathinfo['basename'];
|
1

Use a regular expression to get the part of the filename before the space and number, and compare this to the word saved previously. If it's different, display the {slider ...} header.

$lastfruit = null;
foreach($files as $file) {
    $filename = pathinfo($file);
    $filepath1 = pathinfo($file, PATHINFO_BASENAME);
    $filepath2 = "images/logotipi/fruits/".$filepath1;
    preg_match('#/([^/]+?)(?: \d+)?\.[^/]+$#', $file, $match);
    $fruit = $match[1];
    if ($fruit != $lastfruit) {
        echo '{slider <strong>'.$fruit.'</strong>|blue}';
        echo '<br>';
        $lastfruit = $fruit;
    }
    echo '{tip';
    echo "<img src=\"".$filepath2."\">";
    echo '}';
    echo "<img src=\"".$filepath2."\" ";
    echo 'width="100" height="100" />{/tip}';
    echo '<br>';
}

7 Comments

What if i have something like pic thats called apple green 1.jpg apple green 2.jpg, Thats 2 spaces in string?
I've changed it to use a regexp to get the part of the filename before the number.
Thanks, you are been very helpful! Thats what I wanted.
hehe, i posted this before :)
@Jens-AndréKoch I was making my change at the same time as you posted yours
|

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.