[php] 간단한 형식으로, 파일에서 array로 간편하게 옮기기.

lacovnk의 이미지

간단한 정보들을 파일에 저장하기 위해서 짜봤습니다;

#oneEntry	index1	index2
data1	data2
##wrongOneEntry	index1	index2
data1	data2
##listEntry	index	index1	index2
0	data1	data2
1	data1	data2

oneEntry와 lisdtEntry의 차이는, 여러개가 있느냐, 하나가 있느냐 입니다. 하나만 있을 것이라면 굳이 result[wrongEntry][0]으로 접근 할 필요가 없게 만들려고.. 구분하였습니다;

위 의 파일을 받아, print_r로 찍으면 다음과 같습니다.

Array
(
    [oneEntry] => Array
        (
            [index1] => data1
            [index2] => data2
        )

    [wrongOneEntry] => Array
        (
            [0] => Array
                (
                    [index1] => data1
                    [index2] => data2
                )

        )

    [listEntry] => Array
        (
            [0] => Array
                (
                    [index] => 0
                    [index1] => data1
                    [index2] => data2
                )

            [1] => Array
                (
                    [index] => 1
                    [index1] => data1
                    [index2] => data2
                )

        )

)

code
function getInfoFile($fileName)
{
        $bufFile = file($fileName);
        $key = array();
        $result = array();
        foreach($bufFile as $cur)
        {
                $bufLine = explode("\t",$cur);
                if($bufLine[0][0] == '#')
                {
                        $count = 0;
                        for($i=1;$i<sizeof($bufLine);$i++){$key[$i-1] = trim($bufLine[$i]);}
                        if($bufLine[0][1] == '#')
                        {
                                $name = substr($bufLine[0],2);
                                $flag_multi = true;
                        }
                        else
                        {
                                $name = substr($bufLine[0],1);
                                $flag_multi = false;
                        }
                }
                else
                {
                        if($flag_multi){for($i=0;$i<sizeof($key);$i++){$result[$name][$count][$key[$i]] = trim($bufLine[$i]);}}
                        else{for($i=0;$i<sizeof($key);$i++){$result[$name][$key[$i]] = trim($bufLine[$i]);}}
                        $count++;
                }
        }
        return $result;                                                                                                                         }

거꾸로 array를 위와 같은 형식의 파일로 저장하고 싶은데.. 꽤 복합할 것 같네요 -_- 관심있으신분 도와주세요~~ :)

Forums: 
익명 사용자의 이미지

손으로 직접 데이터를 작성하는거면 위의 코드가 효용성이 있을것 같지만,
php 가 코드를 뽑아내도록 할거면
serialize() 로 편하게 하는것을 추천합니다.

lacovnk의 이미지

serialize하려면 웹 인터페이스를 구현해야하는데 귀찮고;
txt파일만 누군가가 upload해주면 내용을 생성해줘야 하기 때문에 위와 같은 파싱 루틴을 짰습니다 ㅎ

다음에 일일이 파싱하지 말고, serialize된 결과를 저장해서, 그걸 include하는 방식으로 번거롭지만 -_- 사용하고 있습니다 ㅎ

아, 정말 admin 인터페이스 구현해주기 귀찮아요 ㅠㅠ 차라리 제가 대신 해주는 것이 손이 덜 간다는 생각이 드네요;

nainu의 이미지

웹 인터페이스를 구현해야 한다는 게 무슨 뜻인가요 ?_?
저 내용은 serialize로 다 구현될 것 같은데..

lacovnk의 이미지

nainu wrote:
웹 인터페이스를 구현해야 한다는 게 무슨 뜻인가요 ?_?
저 내용은 serialize로 다 구현될 것 같은데..

예를 들어, 홈페이지에 들어갈 텍스트를 나라별로 구별하기 위해서 다음과 같은 내용이 필요하다 칩시다

Quote:
한국어, 일본어, 중국어에 대해서 각각 소개, 연혁의 멘트가 필요하다

이때 admin의 웹인터페이스가 필요합니다

Quote:
1. 웹의 admin 페이지로 접속해서
2. 한국어, 일본어, 중국어의 소개, 연혁 멘트 편집페이지를 연다
3. submit을 하면 내부 처리를 해서 (serialize) 저장해서
4. 실제 사용시에 unserialize해서 사용한다

이때, 위의 파일 업로드를 통해서 한다면

Quote:

1. sftp를 이용해 txt를 받아서
2. 텍스트 편집기로 편집해서
3. 다시 올린다
4. 실제 사용시에는
4-a. 항상 파일을 파싱해서 쓰든지
4-b. 아니면 파싱한 결과를 serialize해서 저장해놨다가, 파일을 다시 읽지 않고 요 serialize 결과만 다시 읽는다

즉, serialize는 내부 구현의 문제입니다;; 그리고 serialize를 하려면 일단 php array로 있어야 하는 것 아닌가요? 그 array를 처음에 어떻게 생성하느냐.. 를 구현한 것이라고 보시면 되겠군요.

목적을 정확하게 안 적어놔서 혼란이 있는 것 같네요 ㅎ

nainu의 이미지

/// @brief 배열을 정해진 형식의 파일로 바꿈
function func ($arr)
{
	$content = "";

	foreach ($arr as $key => $value) {
		$subarr_keys = array_keys($value);
		$subarr_values = array_values($value);
		if (array_key_exists(0, $value) and is_array($value[0])) {
			/// 첫번째 엔트리의 첫번째 값이 배열이면
			$subArray = $value;
			$prefix = "##";
			$indexes = array_keys($subArray[0]);
			$subItem = Array();
			foreach ($subArray as $each) {
				$arr = Array();
				foreach ($indexes as $index) {
					$arr[] = $each[$index];
				}
				$subItem[] = implode (" ", $arr);
			}
		} else {
			/// 배열이 아니면
			$prefix = "#";
			$indexes = $subarr_keys;
			$subItem = Array(implode(" ", $subarr_values));
		}
		$content .= sprintf("%s%s %s\r\n%s\r\n", $prefix, $key, implode(" ", $indexes),
				implode("\r\n", $subItem));
	}
	return $content;
}

지저분하네요~ 되는거 확인하고 바로 ㅎㅎ

근데 문자에 빈칸이 들어가면 좀 난감할 것 같네요~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.