Verschillende waarden uit een bestand aangepast weergeven op een webpage

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jan de boer

jan de boer

08/12/2016 15:02:48
Quote Anchor link
Voor een website die ik aan het opzetten ben moet ik bepaalde waarden uit een bestand die ik op de server opsla op de juiste manier weergeven.
Ik ben hier al een tijdje mee bezig maar ik snap werkelijk niet hoe ik dit het beste kan doen.

Het bestand welke ik "lees" met PHP ziet er als volgt uit:
Quote:
"Mypages"
{
"281074849"
{
"Name" "My test page 1"
"fileID" "1029858993740765071"
"updated" "1443227670"
}
"289239208"
{
"Name" "My test page 2"
"fileID" "8099995980341780415"
"updated" "1438189087"
}
"289252859"
{
"Name" "My test page 3"
"fileID" "2810998257328453720"
"updated" "1447741926"
}
"289290957"
{
"Name" "My test page 3"
"fileID" "8412147622805390167"
"updated" "1438189655"
}
}



In mijn webpagina wil ik het graag zo weergeven:
My test page 1 - http://www.blablablaxxxx.com/page.php?id=281074849 was updated 1443227670
My test page 2 - http://www.blablablaxxxx.com/page.php?id=289239208 was updated 1438189087
My test page 3 - http://www.blablablaxxxx.com/page.php?id=289252859 was updated 1447741926
My test page 4 - http://www.blablablaxxxx.com/page.php?id=289290957 was updated 1438189655

De update time is in UNIX, ik ga deze als alles werkt converteren naar een leesbare datum. Bovenstaande is puur als voorbeeld.


Met gebruik van file_get_contents kan ik de file die al deze info bevat lezen, echter hoe ik nu die bepaalde waarden uit die string moet filteren zodat ze dan vervolgens bij het juiste item in de webpagina komen te staan begrijp ik niet.
Ik heb al wat geprobeerd met stristr, strrchr en strpos maar omdat zowel de characters { en " zo vaak voorkomen snap ik niet goed hoe ik mijn PHP code moet schrijven zodat ik al deze waardes kan lezen en vervolgens kan weergeven.


Ik kan niet veranderen hoe de indeling van de file is. Deze is zoals hierboven beschreven en daar moet ik het mee doen.


Ik hoop dat er hier iemand die mij hiermee kan helpen?


** changed url
Ik wil niet onbedoeld naar sites linken
Gewijzigd op 08/12/2016 15:25:48 door Jan de boer
 
PHP hulp

PHP hulp

02/12/2024 19:49:27
 
Frank Nietbelangrijk

Frank Nietbelangrijk

08/12/2016 15:51:05
Quote Anchor link
De indeling van je bestand lijkt heel erg op JSON. Ik mis alleen de dubbele punten (:), de comma's (,) en de blokhaken ([ en ]). En dat is jammer want dat had het zoveel makkelijker gemaakt.

Kun je zelf nog wijzigingen aanbrengen aan de indeling? Weet je misschien welke extensie erbij hoort?
 
Jan de boer

jan de boer

08/12/2016 16:34:44
Quote Anchor link
Het is een .acf bestand. Ik heb geen invloed over de info die in dit bestand staat en kan er dus ook niets aan veranderen.

Ik zat zelf ook te denken om het bestand te converteren naar iets anders met een andere indeling. Maar dan nog zit ik met het probleem over het identificeren van iedere value (tussen de aanhalings tekens).

Ik ben er ook nu mee bezig en probeer het nu door de " te tellen in het bestand. Die " vertaal ik dan naar een positie en lees ik de value vanaf die positie.
Maar....dat is puur een theorie. Ik heb serieus geen flauw idee of dit gaat werken maar nog belangerijker, hoe ik dat werkend krijg :)
 
Frank Nietbelangrijk

Frank Nietbelangrijk

08/12/2016 17:27:39
Quote Anchor link
Het lijkt er op dat de accolades een array aangeven.

{ = begin array.
} = einde array.

De Aanhalingstekens worden gebruikt om het begin en het einde van een tekenreeks aan te geven.

Je zou dan dit moeten krijgen wanneer je alles correct in de variabele $mypages hebt gestopt en de functie print_r gebruikt om de inhoud te laten zien.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Array
(
    [281074849] => Array
        (
            [Name] => My test page 1
            [fileID] => 1029858993740765071
            [updated] => 1443227670
        )

    [289239208] => Array
        (
            [Name] => My test page 2
            [fileID] => 8099995980341780415
            [updated] => 1438189087
        )

    [289252859] => Array
        (
            [Name] => My test page 3
            [fileID] => 2810998257328453720
            [updated] => 1447741926
        )

    [289290957] => Array
        (
            [Name] => My test page 3
            [fileID] => 8412147622805390167
            [updated] => 1438189655
        )

)


Indien de regels altijd zo mooi onder elkaar staan als je in het voorbeeld laat zien dan kun je beginnen om de regels in een array te zetten. Dit kun je direct doen tijdens het inlezen van het bestand met de functie file.

Vervolgens kun je een regel als "Name" "My test page 1" in delen hakken met de functie explode en trim.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$array
= explode('" "', $regel);
?>

Hierna zit je dan nog met aanhalingstekens die je zult moeten verwijderen. Dit zou je met str_replace kunnen doen maar die houdt geen rekening met escaped double qoutes (\")..
Gewijzigd op 08/12/2016 17:37:19 door Frank Nietbelangrijk
 
- Ariën  -
Beheerder

- Ariën -

08/12/2016 17:58:28
Quote Anchor link
Wat maakt die *.acf file aan? Kent dit geen oplossing om het in een fatsoenlijk formaat zoals JSON of XML te outputten? Ook handig om eens naar te kijken voordat je toch ergens een vorm van corruptie krijgt in je output.
 
Jan de boer

jan de boer

08/12/2016 19:45:37
Quote Anchor link
Frank Nietbelangrijk op 08/12/2016 17:27:39:
Indien de regels altijd zo mooi onder elkaar staan als je in het voorbeeld laat zien dan kun je beginnen om de regels in een array te zetten. Dit kun je direct doen tijdens het inlezen van het bestand met de functie file.


Helaas, als ik de file zo inlees dan krijg ik één grote bende. Het wordt één grote array met oplopende nummers.


Ik heb het geprobeerd met het tellen van de " maar helaas geeft dat ook een probleem omdat er bij sommige entries zomaar een extra waarde bijkomt. Dus heb je niet het gelijke aantal " per item :(



Frank Nietbelangrijk op 08/12/2016 17:27:39:
Het lijkt er op dat de accolades een array aangeven.

{ = begin array.
} = einde array.

De Aanhalingstekens worden gebruikt om het begin en het einde van een tekenreeks aan te geven.

Je zou dan dit moeten krijgen wanneer je alles correct in de variabele $mypages hebt gestopt en de functie print_r gebruikt om de inhoud te laten zien.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Array
(
    [281074849] => Array
        (
            [Name] => My test page 1
            [fileID] => 1029858993740765071
            [updated] => 1443227670
        )

    [289239208] => Array
        (
            [Name] => My test page 2
            [fileID] => 8099995980341780415
            [updated] => 1438189087
        )

    [289252859] => Array
        (
            [Name] => My test page 3
            [fileID] => 2810998257328453720
            [updated] => 1447741926
        )

    [289290957] => Array
        (
            [Name] => My test page 3
            [fileID] => 8412147622805390167
            [updated] => 1438189655
        )

)



Ik begrijp nog maar weing van hoe te werken met arrays. Als ik simpele voorbeelden bekijk denk ik...ah zo.
Maar als ik dat dan moet vertalen naar wat ik in dit topic probeer dan raak ik al helemaal in paniek.
Kun je mij vertellen hoe ik de info uit de file waarvan ik dus een string heb (gekregen met file_get_contents ) naar een array zou moeten vertalen?:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
"Mypages"
{
"281074849"
{
"Name"    "My test page 1"
"fileID"    "1029858993740765071"
"updated"    "1443227670"
}
"289239208"
{
"Name"    "My test page 2"
"fileID"    "8099995980341780415"
"updated"    "1438189087"
}
"289252859"
{
"Name"    "My test page 3"
"fileID"    "2810998257328453720"
"updated"    "1447741926"
}
"289290957"
{
"Name"    "My test page 3"
"fileID"    "8412147622805390167"
"updated"    "1438189655"
}
}




@Arien
helaas is deze acf file het waarmee ik het moet doen. Geen andere opties, geen edit mogelijkheden.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

08/12/2016 19:54:14
Quote Anchor link
Ik denk persoonlijk ook dat het geen beginners klusje is Jan. Als je array's nog niet goed door hebt dan kom je al gauw in de knoop met dit soort dingen.

Je hebt dan twee keuzes.

a) Gas terug. Eerst verder stoeien met array's
b) uitbesteden.
 
Jan de boer

jan de boer

08/12/2016 21:28:25
Quote Anchor link
Ik wil graag zelf verder stoeien met arrays anders leer ik het nooit.

Ok, ik begrijp dat als ik deze arrays nu eindelijk eens door wil krijgen ik het maar gewoon moet gaan doen. Ik hoop dat jullie mij misschien een beetje bij kunnen staan hierbij.

Dus nieuwe aanpak.
Ik heb de hele string opgeschoond en deze ziet er nu zo uit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
"Mypages"
{
281074849 {
Name: My test page 1,
fileID: 1029858993740765071,
updated: 1443227670
}
289239208 {
Name: My test page 2,
fileID: 8099995980341780415,
updated: 1438189087
}
289252859
{
Name: My test page 3,
fileID: 2810998257328453720,
updated: 1447741926,
}
289290957
{
Name: My test page 3,
fileID: 8412147622805390167,
updated: 1438189655,
}
}



Na wat zoeken vond ik deze code om een array te maken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
foreach (explode('{', $homepage) as $pair) {
    list($key, $value) = explode(':', $pair);
    $final[$key] = $value;
}

print_r($final);


Maar ik krijg een offset error:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
Notice: Undefined offset: 1 in F:\index.php on line 72
Array ( [ 281074849 ] => [
manifest] => 1388947193099289958,
size )



Regel 72 is "list($key, $value) = explode(':', $pair);"


Het lijkt mij dat dat komt door hoe ik mijn array probeer te maken. Echter snap ik niet hoe deze code dan wel zou moeten zijn.
 
Thomas van den Heuvel

Thomas van den Heuvel

09/12/2016 15:38:16
Quote Anchor link
Idee: omdat het verdacht veel op JSON lijkt, maak er JSON van?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?php
error_reporting(E_ALL);
ini_set('display_errors', 'stdout');

// input
ob_start();
?>

"Mypages"
{
"281074849"
{
"Name" "My test page 1"
"fileID" "1029858993740765071"
"updated" "1443227670"
}
"289239208"
{
"Name" "My test page 2"
"fileID" "8099995980341780415"
"updated" "1438189087"
}
"289252859"
{
"Name" "My test page 3"
"fileID" "2810998257328453720"
"updated" "1447741926"
}
"289290957"
{
"Name" "My test page 3"
"fileID" "8412147622805390167"
"updated" "1438189655"
}
}
<?php
$in
= trim(ob_get_clean());

// output
$out = '{';
$depth = 0; // keep track of depth
$items = array(0 => 0); // keep track of number of items on current depth

// evaluate each line, this can either be:
// an opening token {
// a subarray key "X"
// a key-value pair "X" "Y"
// a closing token }

foreach (explode("\n", $in) as $line) {
    // add new level
    if ($line == '{' || $line == '}') {
        $out .= $line;
        if ($line == '{') {
            $depth++;
            $items[$depth] = 0; // reset number of items on this level
        }
        if ($line == '}') {
            $depth--;
        }

    // single item between double quotes; this is a subarray key
    } elseif (preg_match('#^("[^"]+")$#', $line, $matches) === 1) {
        $out .= ($items[$depth] > 0 ? ',' : '').$matches[1].':';
        $items[$depth]++;
    // multiple items between double quotes, these are key-value pairs
    } elseif (preg_match('#^("[^"]+")\s+("[^"]+")$#', $line, $matches) === 1) {
        $out .= ($items[$depth] > 0 ? ',' : '').$matches[1].':'.$matches[2];
        $items[$depth]++;
    }
else {
        die('[read error]');
    }
}

$out .= '}';
// $out should now contain a valid JSON string, we can convert this to an array in one go
$array = json_decode($out, true);
?>
<h2>rebuilt string in JSON</h2>
<pre><?php echo $out ?></pre>
<h2>array</h2>
<pre><?php print_r($array) ?></pre>

EDIT: intuitievere naamgeving ($depth, $items in plaats van respectievelijk $currentLevel en $levels)
Gewijzigd op 09/12/2016 16:07:34 door Thomas van den Heuvel
 
Michael -

Michael -

09/12/2016 18:42:02
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php
$string
= <<< 'EOT'
    "Mypages"

    {
    "281074849"
    {
    "Name" "My test page 1"
    "fileID" "1029858993740765071"
    "updated" "1443227670"

    }
    "289239208"
    {
    "Name" "My test page 2"
    "fileID" "8099995980341780415"
    "updated" "1438189087"

    }
    "289252859"
    {
    "Name" "My test page 3"
    "fileID" "2810998257328453720"
    "updated" "1447741926"

    }
    "289290957"
    {
    "Name" "My test page 3"
    "fileID" "8412147622805390167"
    "updated" "1438189655"

    }
    }

EOT;

/* Get string between accolades */
preg_match_all('/"\K[^"]*(?=")/m', $string, $matches);
/**/

/* Clear string to nice array */

foreach($matches as $match) {
    foreach($match as $str) {
        /* Remove curly braces */
        $arr[] = preg_replace('/[{]?[}]?/', '', $str);
        /**/
    }
    /* Remove spaces, keys and empty values and reorder keys */
    $res = array_values(array_filter(array_map('trim',array_diff($arr, array('Name','fileID','updated')))));
    /**/
}
/**/

/* Save title if needed */

$array[] = array(
    'title' => $res[0],
);

/**/
/* Remove title */

unset($res[0]);
/**/

/* Split array */

$chunk = array_chunk($res, 4);
/**/

/* Rename array keys */

foreach($chunk as $pages) {
    $array[] = array(
        'id' => $pages[0],
        'Name' => $pages[1],
        'fileID' => $pages[2],
        'updated' => $pages[3],
    );
}

/**/

echo'<pre>';print_r($array);echo'</pre>';

foreach($array as $key=>$page) {
    if(isset($page['Name'],$page['id'],$page['updated'])) {
        echo $page['Name'] . ' - http://www.ext/page.php?id=' . $page['id'] . ' was updated ' . $page['updated'] . '<br/>';
    }
else if(isset($page['title'])) {
        echo '<h2>' . $page['title'] . '</h2>';
    }
}

?>


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
Array
(
    [0] => Array
        (
            [title] => Mypages
        )

    [1] => Array
        (
            [id] => 281074849
            [Name] => My test page 1
            [fileID] => 1029858993740765071
            [updated] => 1443227670
        )

    [2] => Array
        (
            [id] => 289239208
            [Name] => My test page 2
            [fileID] => 8099995980341780415
            [updated] => 1438189087
        )

    [3] => Array
        (
            [id] => 289252859
            [Name] => My test page 3
            [fileID] => 2810998257328453720
            [updated] => 1447741926
        )

    [4] => Array
        (
            [id] => 289290957
            [Name] => My test page 3
            [fileID] => 8412147622805390167
            [updated] => 1438189655
        )

)

Mypages
My test page 1 - http://www.ext/page.php?id=281074849 was updated 1443227670
My test page 2 - http://www.ext/page.php?id=289239208 was updated 1438189087
My test page 3 - http://www.ext/page.php?id=289252859 was updated 1447741926
My test page 3 - http://www.ext/page.php?id=289290957 was updated 1438189655
Gewijzigd op 09/12/2016 18:43:26 door Michael -
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.