Задать вопрос
Vosined_12
@Vosined_12
Ученик

Как организовать поиск по ключам многомерного массива?

Есть массив неограниченного уровня вложенности, например:
$out_data = array(
    'home' => ['city' => 'Miami', 'state' => 'FL', 'location' => ['lat' => '40.00', 'long' => '50.00']],
    'work' => ['main' => ['role' => 'cheif', 'address' => 'Miami, FL'], 'hobby' => ['role' => 'painter', 'address' => null]],
    'age' => 68
);

1. Нужно сделать поиск по нему, чтобы при запросе "age" возвращалось значение 68, а при запросе "home\loction" возвращался массив с значениями [ lat => 40.00, long => 50.00 ].
2. Как сделать добавление элементов в такой массив, чтобы при добавлении в массив элемента 'work\new\', к нему можно было добавить массив вида '[‘role’ => ‘new_work_role’, ‘address’ => ‘homeland’ ]'?

Уточню, что необходимо сделать функцию, в которую при передаче одного параметра вида 'age' или 'home\location' осуществлялся поиск, а при добавлении двух параметров: "home\loction" и массива - осуществлялось добавление. При этом глубина массива неизвестна, т.е. может потребоваться добавление данных в массив по адресу "home\loction\secret\new1" и даже глубже.
  • Вопрос задан
  • 714 просмотров
Подписаться 1 Оценить Комментировать
Решения вопроса 1
pashted
@pashted
тыжпрограммист
echo $out_data['age'];

print_r($out_data['home']['location']);

$out_data['work']['new'] = ['role' => 'new_work_role', 'address' => 'homeland'];
print_r($out_data['work']['new']);


поиск значения по нескольким ключам
$out_data = array(
    'home' => ['city' => 'Miami', 'state' => 'FL', 'location' => ['lat' => '40.00', 'long' => '50.00']],
    'work' => ['main' => ['role' => 'cheif', 'address' => 'Miami, FL'], 'hobby' => ['role' => 'painter', 'address' => null]],
    'age' => 68
);

function get_data($data, $param) {
        $param = explode('\\', $param);

        $result = $data[$param[0]];

        for ($i = 1; $i < count($param); $i++) {
            $result = $result[$param[$i]];
        }

        return $result;
}

print_r(get_data($out_data, 'age'));
print_r(get_data($out_data, 'home\location'));
print_r(get_data($out_data, 'work\main\address'));


добавление нового элемента
function set_data(&$arr, $data, $param) {
        $param = explode('\\', $param);
        $result = &$arr[$param[0]];

        for ($i = 1; $i < count($param); $i++) {
            $result = &$result[$param[$i]];
        }
        $result = $data;
    }

set_data($out_data, ['role' => 'boss', 'address' => 'Secret Base 1'], 'work\main\secret_job\project_1\state\city\street');

результат добавления
print_r($out_data);
Array
(
    [home] => Array
        (
            [city] => Miami
            [state] => FL
            [location] => Array
                (
                    [lat] => 40.00
                    [long] => 50.00
                )

        )

    [work] => Array
        (
            [main] => Array
                (
                    [role] => cheif
                    [address] => Miami, FL
                    [secret_job] => Array
                        (
                            [project_1] => Array
                                (
                                    [state] => Array
                                        (
                                            [city] => Array
                                                (
                                                    [street] => Array
                                                        (
                                                            [role] => boss
                                                            [address] => Secret Base 1
                                                        )

                                                )

                                        )

                                )

                        )

                )

            [hobby] => Array
                (
                    [role] => painter
                    [address] => 
                )

        )

    [age] => 68
)
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Snewer
нет возможности проверить и отладить. но предлагаю такую логику:

function set_array_value(&$array, $key, $value){
        if(!is_array($key)){
            $key = explode('\\', $key);
        }

        $currentKey = array_shift($key);
        
        if(!is_array($array[$currentKey])){
            if(!isset($array[$currentKey])){
                $array[$currentKey] = [];
            } else {
                $array[$currentKey] = [ $array[$currentKey]];
            }
        }

        if(count($key) > 0){
            set_array_value($array[$currentKey], $key, $value);
        } else {
            if(is_array($array[$currentKey])){
                $array[$currentKey][] =  $value;
            } else {
                $array[$currentKey] = [$array[$currentKey], $value];
            }
        }
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы