Если я понимаю ваш вопрос, у вас есть массив данных и вы хотите автоматически выбрать значения на основе массива схемы?
<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!