Search code examples
phpmultidimensional-arrayflat-file

multidimensional array php flat-file


I am upgrading the way my website runs, I have already integrated mant php scripts in pages, but I am trying to develop fully php based site, eg, instead of loading urls:

url/events/event-1
url/events/event-2

^^^ 2 seperate pages

I am trying to load

url/event?url=event-1

this is so I can update 1 page but load different content depending on the

$_GET['url']

parameter.....

what I have so far...

I load url/event?url=dance

it will automatically search a directory for the filename 'dance.txt'

if the file does not exist, it forwards to main events page (url/events)

if the files does exist, it creates a one line string about the event....

the file content is listed like this:

Dance::::18-02-2012::::http://{external link}::::Event Information

the script I have developed to import this data and display it, works fine, but I need a page that will load all events each in a separate div.......

producing this page is simple enough if I can figure out how to arrange the event array data into a multidimensional array for all events...

for individual events, the script simply defines variables as:

$name, $date, $link, $writeup

I have attached sample code of how I do this...

    $dir    = '/server/htdocs/data/';     // path to dir with all event txt files in
$files = scandir($dir);

$fruit = array_shift($files);

$fruit2 = array_shift($files);    // array shifts remove values of '.' and '..'

$line = implode(" ",$files);    // back into string for str_replace

// echo $line;

$oldword = ".txt";

$newword = "";

$newline = str_replace($oldword, $newword, $line);

// echo $newline;


$files = explode(" ", $newline); // array of filenames

if (in_array($url, $files)) {
  $contents = file_get_contents('data/'.$url.'.txt');
} else { header('Location: http://{url}/events'); }

$info = explode('::::', $contents);

// print_r($info);

$name = $info[0];

$date = $info[1];

$link = $info[2];

$writeup = $info[3];

this works perfectly for individual pages, however, I need to have an array like this:

$events = array ( array ( Name => event-1,
                          Date => date-1,
                          Link => link-1,
                          Writeup => event-info ),

                  array ( Name => event-2,
                          Date => date-2,
                          Link => link-2,
                          Writeup => event-info ),

                  array ( Name => event-3,
                          Date => date-3,
                          Link => link-3,
                          Writeup => event-info )
                        );

this is how I presume the array would be formed, but I need the script to count how many files there are in the /data/ folder, and then (I'm presuming) have a foreach loop so that for each array (event) I can echo:

<div id="content2"> 
                    <div class="post">
<center><h2><u>'.$name.' ('.$date.')</u></h2></center>
                       <p class="postmeta"></p>
                        <div class="entry">

<CENTER><img src="events/posters/'.$name.'.jpg" height="400" width="500"></center>

<p><p>

<p>'.$writeup.'</p>

<p><a href="'.$link.'" " target="_blank">'.$name.' Online</a></p>


 </div>
                    </div><!-- post --> 
                </div><!-- content2 -->

I know it may seem a complicated way of going around things, but this way my site will be 100% editable via data in txt files, as right now I have to clone existing page, then re-write all content in it for new event!

foreach($files as $key => $value) {

$array[] = array(explode('::::',(file_get_contents('data/'.$files[$key].'.txt'))));

}

print_r($array);

gives me:

Array
(
    [0] => Array
        (
            [0] => Array
                (
                    [0] => 5th-Element
                    [1] => 11-02-2012
                    [2] => http://www.5thelementrocks.co.uk/
                    [3] => 5th Element are a 5 piece classic rock covers band gigging in venues across the North-West and Wales. Our set lists include tracks by all the greats, including AC/DC, The Cult, Muse, Bon Jovi, Nirvana, Whitesnake, The Darkness, Ozzy Osbourne, and many more. </p><p>We are a high quality, high energy, experienced classic rock band who work hard and play hard to get the audience going and to make sure each gig is a pro performance. Whether were playing for a crowd of one or one thousand, we always give 110% to keep you shakin all night long!
                )
        )

    [1] => Array
        (
            [0] => Array
                (
                    [0] => BBGM
                    [1] => 25-02-2012
                    [2] => http://nwb.co/bbgm
                    [3] => BBGM are four 40-50 something musicians (twin guitars, vocals, bass & drums) who were all in various bands years ago, playing and touring all over the North of England & Europe in the 1980s including working and recording with the now legendary producer Gil Norton.</p><p>In 2007 they got together to form BBGM to gig again. Now an established band on the Northwest circuit we are currently gigging throughout the North West and North Wales playing classic rock covers from the 70's 80's and 90's throwing in one or two original tracks penned over the years.
                )
        )

    [2] => Array
        (
            [0] => Array
                (
                    [0] => Plastic-Sarcasm
                    [1] => 18-02-2012
                    [2] => http://www.facebook.com/pages/PLASTIC-SARCASM/284242054943613?sk=info
                    [3] => Four lads who are still burning. Having the desire to kick ass every now and then through the music they create.</p><p>Originally formed in 1978 by current member Phil Narayan together with Paul Wynne, Phil Tonge and Baz Yates, the Band played in the Punk Rock scene era in and around Bolton. Having not played guitar (but played drums for a couple of years from 1986 1989) on stage for over thirty years, Phil Narayan couldn't resist a late urge to enjoy the feeling of playing live on stage once again. Regularly practising with PLUM ( joined the band as singer in 1980) who, now plays Bass guitar and sings, the pair set about making the dream happen once again. They recruited Gordon Connolly for an extra guitar who has been playing throughout his life with various bands, in September 2010. Finally, drummer Gag Martin joined up in reply to an advert at the local rehearsal studios in May 2011.</p><p>"Having had 9 practice / Jammin sessions the band played their first gig in Little Lever on 17th December 2011 where all the old Punk songs were revived. The gig was a screaming success and it is the intention to do more gigs in 2012 when the band will gradually introduce their own numbers more and more as gigs go by."
                )
        )

    [3] => Array
        (
            [0] => Array
                (
                    [0] => Whipcord
                    [1] => 17-02-2012
                    [2] => http://www.facebook.com/whipcord
                    [3] => Doobie Brothers in Bad Brains t-shirts, whistling The Hollies on the way to a Pentagram gig, reading The Wire...it's rock n roll!!</p><p>Whipcord are a stentorian rock n roll power trio from Salford, Manchester UK. Within the noise is a classicist rock feel, drowning in a tar pool of punk rock fury. Being described as the bastard child of Motorhead and Foo Fighters. and that of polished anarchy, not unlike The Whos live shows.
                )
        )
)

aha nearly done.

ps I would like foreach to list by dates stated in each txt file, it currently lists alphabetically from filenames...


Solution

  • Borrowed a bit of Jribeiro's code to actually read the files into the two-dimensional array.

    $items = array();
    if ($handle = opendir($dir)) {
        while (false !== ($file = readdir($handle))) {
            $fp = fopen("$file","r");
    
            while($line = fgets($fp)){
                $parts = explode("::::",$line);
                $newArr["Name"] = $parts[0];
                $newArr["Date"] = $parts[1];
                $newArr["Link"] = $parts[2];
                $newArr["Writeup"] = $parts[3];
                $items[] = $newArr;  // add newArr to items
            }
            fclose($fp);
        }
        closedir($handle);
    }
    
    print_r($items);
    

    Then, to loop through the $items array:

    foreach($items as $item){
        $name = $item["Name"];
        echo "Name is $name<br>";
        // etc
    }
    

    Although, I'm required to inform you to look into using MySQL to do this as it is much easier, safer, and more powerful than using a flat text file.