Reputation: 129
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?
Upvotes: 2
Views: 166
Reputation: 683
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}
Upvotes: 2
Reputation: 780974
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>';
}
Upvotes: 1
Reputation: 41756
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+
Upvotes: 2