array to object
Ik heb dit lang geleden als eens geprobeerd en toen kreeg ik het niet exact voor elkaar zoals ik wilde. Daarom zal ik de vraag nog eens stellen... ik ben benieuwd of het uberhaupt mogelijk is.
Ik wil een array met paden omzetten naar een object. Ik heb bijvoorbeeld de volgende paden:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$paths = array();
$paths['public'] = '/home/xxx/public_html/';
$paths['public']['content'] = '/home/xxx/public_html/content/';
$paths['public']['content']['images'] = '/home/xxx/public_html/content/images/';
$paths['public']['content']['images']['thumbnails'] = '/home/xxx/public_html/content/images/thumbnails/';
?>
$paths = array();
$paths['public'] = '/home/xxx/public_html/';
$paths['public']['content'] = '/home/xxx/public_html/content/';
$paths['public']['content']['images'] = '/home/xxx/public_html/content/images/';
$paths['public']['content']['images']['thumbnails'] = '/home/xxx/public_html/content/images/thumbnails/';
?>
Nu wil ik bijvoorbeeld het 'content' pad als volgt kunnen aanroepen:
$paths->content;
en het 'thumbnail' pad wil ik als volgt kunnen aanroepen:
$paths->content->images->thumbnails;
Is wat ik wil mogelijk? Of kan zoiets niet en moet ik het bijvoorbeeld zo oplossen:
$paths->content;
$paths->content_images_thumbnails;
Wie kan mij advies geven? Ik hoor het graag! (Mocht het zo zijn dat de opbouw van de array anders moet dan is dat geen enkel probleem.)
php array to object eerste hit.
Wouter, zo ver was ik zelf ook wel, dus snap je reactie niet helemaal. Ik heb die optie destijds gebruikt, maar ik kon niet verder komen dan bijv. $path->content, maar $path->content->images->thumbnails werkte niet. Vandaar mijn vraag.
Quote:
Here's an example below that converts a multi-dimensional array to an object. This is accomplished through recursion.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
function arrayToObject($array) {
if(!is_array($array)) {
return $array;
}
$object = new stdClass();
if (is_array($array) && count($array) > 0) {
foreach ($array as $name=>$value) {
$name = strtolower(trim($name));
if (!empty($name)) {
$object->$name = arrayToObject($value);
}
}
return $object;
}
else {
return FALSE;
}
}
?>
function arrayToObject($array) {
if(!is_array($array)) {
return $array;
}
$object = new stdClass();
if (is_array($array) && count($array) > 0) {
foreach ($array as $name=>$value) {
$name = strtolower(trim($name));
if (!empty($name)) {
$object->$name = arrayToObject($value);
}
}
return $object;
}
else {
return FALSE;
}
}
?>
Code (php)
Code (php)
1
2
3
4
2
3
4
<?php
// Now you can use $p like this:
echo $p->first->name; // Will print 'Richard'
?>
// Now you can use $p like this:
echo $p->first->name; // Will print 'Richard'
?>
Ik wil bijvoorbeeld dit:
echo $p->first->name->firstletter; // Will print 'R'
Kan dat ook? Daar zou ik graag een oplossing voor horen. Hoe moet ik dan die array instellen?
Ik wil dus dit kunnen doen:
echo $p->first->name->firstletter; // Will print 'R'
maar ook dit:
echo $p->first->name; // Will print 'Richard'
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
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
<?php
class NameBag
{
private $name;
public function __construct($name)
{
$this->name = $name;
}
public function getFirstLetter()
{
return $this->name[0];
}
public function __toString()
{
return $this->name;
}
public function __get($key)
{
if (method_exists($this, $key)) {
return $this->$key();
} elseif (($getter = 'get'.ucfirst($key)) && method_exists($this, $getter)) {
return $this->$getter();
}
}
}
$person = array(
'first' => array(
'name' => new NameBag('Richard'),
),
);
echo $person->first->name; // >> 'Richard'
echo $person->first->name->firstLetter; // >> 'R'
class NameBag
{
private $name;
public function __construct($name)
{
$this->name = $name;
}
public function getFirstLetter()
{
return $this->name[0];
}
public function __toString()
{
return $this->name;
}
public function __get($key)
{
if (method_exists($this, $key)) {
return $this->$key();
} elseif (($getter = 'get'.ucfirst($key)) && method_exists($this, $getter)) {
return $this->$getter();
}
}
}
$person = array(
'first' => array(
'name' => new NameBag('Richard'),
),
);
echo $person->first->name; // >> 'Richard'
echo $person->first->name->firstLetter; // >> 'R'
Maar als ik je dus goed begrijp, kan wat ik wil niet met een array?
dat klopt
okeej... dan moet ik even kijken hoe ik dat moet oplossen. Thanks!
Dankjewel Rick! Ik heb inmiddels een functie gevonden die dat wel automatisch kan, van een array een object maken dus ik kan voorlopig vooruit. Bedankt voor het meedenken!