Verschillende waarden uit een bestand aangepast weergeven op een webpage
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"
}
}
{
"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
Kun je zelf nog wijzigingen aanbrengen aan de indeling? Weet je misschien welke extensie erbij hoort?
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 :)
{ = 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)
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
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
)
)
(
[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.
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
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.
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.
{ = 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)
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
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
)
)
(
[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)
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
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"
}
}
{
"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.
Je hebt dan twee keuzes.
a) Gas terug. Eerst verder stoeien met array's
b) uitbesteden.
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)
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
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,
}
}
{
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)
1
2
3
4
5
6
2
3
4
5
6
foreach (explode('{', $homepage) as $pair) {
list($key, $value) = explode(':', $pair);
$final[$key] = $value;
}
print_r($final);
list($key, $value) = explode(':', $pair);
$final[$key] = $value;
}
print_r($final);
Maar ik krijg een offset error:
Code (php)
1
2
3
4
2
3
4
Notice: Undefined offset: 1 in F:\index.php on line 72
Array ( [ 281074849 ] => [
manifest] => 1388947193099289958,
size )
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.
Code (php)
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
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>
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
Code (php)
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
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>';
}
}
?>
$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)
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
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
(
[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 -