Обработка списка путей ассоциативных массивов в PHP - PullRequest
0 голосов
/ 26 января 2012

У меня есть блок данных, который при несериализации выглядит примерно так:

Array ( 
    [profile] => Array ( 
        [name] => Array ( 
            [firstName] => Slug 
            [midName] => Foo 
            [lastName] => Bar 
            [formatted] => Slug Foo Bar ) 
        [displayName] => Slug
    )
)

и таблица, в которой хранятся пути к этим значениям следующим образом:

['profile']['name']['firstName'],
['profile']['name']['lastName'],
...
['profile']['displayName']

IЯ хотел бы пройтись по списку путей и получить значения для определенного массива, но не могу понять, как создать массив и путь, чтобы получить значение:

$pathlist = array(
  ['profile']['name']['firstName'],
  ['profile']['name']['midName'],
  ['profile']['name']['lastName'],
  ['profile']['displayName']
);

$user = array(
  [profile] => array ( 
    [name] => array ( 
      [firstName] => Slug 
      [midName] => Foo 
      [lastName] => Bar 
    ), 
    [displayName] => Slug
  )
);

foreach ($pathlist as $path) {
  // display value using user array and pathitem
  echo $user$path;
}

Любойесть предложения?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 26 января 2012

Если я понимаю ваш вопрос, у вас есть массив данных и вы хотите автоматически выбрать значения на основе массива схемы?

<code><?php

$schema = array(
    'profile' => array(
        'name' => array(
            'firstName',
            'midName',
            'lastName'
        ),
        'displayName'
    )
);

$users = array(
    1 => array(
        'profile' => array(
            'name' => array(
                'firstName' => 'Joe',
                'midName'   => 'Pooface',
                'lastName'  => 'Bloggs'
            ),
            'displayName' => 'Joey'
        )
    ),
    2 => array(
        'profile' => array(
            'name' => array(
                'firstName' => 'John',
                'midName'   => 'Weeface',
                'lastName'  => 'Doe'
            ),
            'displayName' => 'Johnny'
        )
    )
);


echo "<pre>";

foreach ($users as $user) {

    foreach ($schema as $k1 => $v1) {
        if (is_array($v1)) {
            foreach ($v1 as $k2 => $v2) {
                if (is_array($v2)) {
                    foreach ($v2 as $k3 => $v3) {
                        if (is_string($v3)) {
                            echo "{$v3}: {$user[$k1][$k2][$v3]}\n";
                        }
                    }
                } else {
                    echo "{$v2}: {$user[$k1][$v2]}\n";
                }
            }
        } else {
            echo "{$v1}: {$user[$v1]}\n";
        }
        echo "\n";
    }
}

echo "
";

I 'Я уверен, что это можно исправить с помощью функции обратного вызова массива вместо ручного обхода каждого уровня.

Однако это из-за плохого способа решения проблем, вы должныпо крайней мере, инкапсулировать каждого пользователя в какой-то пользовательский объект, который уже знает структуру массива данных. Например:

<?php

$users = array(
    1 => array(
        'profile' => array(
            'name' => array(
                'firstName' => 'Joe',
                'midName'   => 'Pooface',
                'lastName'  => 'Bloggs'
            ),
            'displayName' => 'Joey'
        )
    )
);


class User 
{

    private $data;

    public function __construct(array $data)
    {
        $this->data = $data;
    }

    public function getFirstName()
    {
        return $this->data['profile']['name']['firstName'];
    }

    public function getDisplayName()
    {
        return $this->data['profile']['displayName'];
    }

}

$joe = new User($users[1]);
echo "Hello, {$joe->getDisplayName()}!";
// Hello, Joey!
0 голосов
/ 26 января 2012

Если вы просто хотите перебрать свой несериализованный массив, используйте array_walk_recursive:

$user = array(
    'profile' => array ( 
        'name' => array ( 
            'firstName' => 'John', 
            'midName' => 'Wilberforce', 
            'lastName' => 'Doe' 
        ), 
        'displayName' => 'bobthebuilder'
    )
);

function display($item, $key)
{
        echo "$key => $item\n";
}

array_walk_recursive($user, 'display');

Выход:

firstName => John
midName => Wilberforce
lastName => Doe
displayName => bobthebuilder
0 голосов
/ 26 января 2012

Вы можете использовать Eval, но я Wouldent.Лучше взорвите ['и'] из вашего массива и скажите $ user [$ path]…

...