多维数组php平面文件

时间:2012-02-18 16:28:23

标签: php multidimensional-array flat-file

我正在升级我的网站运行方式,我已经在页面中集成了mant php脚本,但我正在尝试开发完全基于php的网站,例如,而不是加载网址:

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

^^^ 2个单独的页面

我正在尝试加载

url/event?url=event-1

这样我可以更新1页,但根据

加载不同的内容
$_GET['url']

参数.....

到目前为止我有什么......

我加载url / event?url = dance

它会自动在目录中搜索文件名'dance.txt'

如果文件不存在,则转发到主事件页面(url / events)

如果文件确实存在,它会创建一个关于事件的一行字符串....

文件内容列出如下:

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

我开发的脚本导入这些数据并显示它,工作正常,但我需要一个页面,它将在一个单独的div中加载所有事件.......

如果我能弄清楚如何将事件数组数据排列成所有事件的多维数组......

生成这个页面很简单。

对于单个事件,脚本只是将变量定义为:

$name, $date, $link, $writeup

我附上了我如何做的示例代码.....

    $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];

这适用于单个页面,但是,我需要有这样的数组:

$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 )
                        );

这就是我假设数组将会形成的方式,但我需要脚本来计算/ data /文件夹中有多少文件,然后(我假设)有一个foreach循环,以便每个数组(事件)我可以回应:

<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 -->

我知道这似乎是解决问题的一种复杂方式,但这样我的网站将通过txt文件中的数据100%可编辑,因为现在我必须克隆现有页面,然后重新编写其中的所有内容新活动!!!!

感谢有人能帮助我

EDIT .....

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

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

}

print_r($array);

给了我:

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.
                )

        )

)
几乎已经完成了,感谢帮助人员

ps我希望foreach按照每个txt文件中的日期列出,它目前按字母顺序从文件名列出....谢谢

3 个答案:

答案 0 :(得分:1)

借用了一些Jribeiro的代码来实际将文件读入二维数组。

$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);

然后,遍历$items数组:

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

虽然,我需要通知您使用MySQL来实现这一点,因为它比使用平面文本文件更容易,更安全,更强大。

答案 1 :(得分:1)

如果你想要dir中的文件数量,你可以试试这个:

function fileCounter($dir){
    $counter = 0;
    if ($handle = opendir($dir)) {
      //echo "Directory handle: $handle\n";
      //echo "Files:\n";
      /* This is the correct way to loop over the directory. */
      while (false !== ($file = readdir($handle))) {
          //echo "<BR>".$counter." - $file";
          $counter++;
      }
      closedir($handle);
    }
    $counter -= 1; // in order to exclude '.' and '..', as well as start the counter on 1
    return $counter;
}

答案 2 :(得分:0)

我实际上不太确定我是否正确理解了你的问题。 但最后你想在一个平面文件中存储一个嵌套数组$events并将其读回一个数组? 我建议使用serialize来做这件事,然后它很简单:

$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 )
                        );
file_put_contents("/foo/bar",serialize($events)); // BAM, it's in the file :)
//reading it back is equally simple
$events2 = unserialize(file_get_contents("/foo/bar"));