Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153

Обращение к элементу массива через значение переменной

07.12.2017, 23:00. Показов 5083. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ключ массива хранится в виде значения переменной, например:
PHP
1
$key="['parameter_1']['value']"
или так
PHP
1
$key='[\'parameter_1\'][\'value'\]'
т.е квадратные скобки находятся уже в значении переменной $key.

Как можно обратится к соответствующему элементу массива, что то типа:
PHP
1
$value = $my_array от..$key

Можно так сделать или надо мудрить с eval(). Хотя и с ним не пойму как сделать
Спасибо

Добавлено через 17 минут
И еще , можно ли как-то проверить наличие в массиве такого "ключа" при помощи array_key_exists()
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
07.12.2017, 23:00
Ответы с готовыми решениями:

Обращение к элементу массива через ->
Приветствую! Встретил такое обращение к элементу массива в представлении: @foreach($posts as $post) <article> ...

Обращение к элементу массива через указатель
Здравствуйте, точно помню, что A и *(A+i) это одно и тоже то вот почему-то не хочет работать #include "stdafx.h" ...

Обращение к элементу массива через адрес
#include "a.h" #include <iostream> #include<stdio.h> using namespace std; void vvod(float mas,int n); void calc(float...

16
 Аватар для otto-fukin
14 / 60 / 21
Регистрация: 15.06.2017
Сообщений: 572
07.12.2017, 23:11
ключом массива может быть любая скалярная переменная и null. Строки которые вы написали вполне подходят.

Не по теме:

Другое дело что это выглядит как извращение с непонятно какой целью.

0
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
07.12.2017, 23:50  [ТС]
Цитата Сообщение от otto-fukin Посмотреть сообщение
ключом массива может быть любая скалярная переменная и null. Строки которые вы написали вполне подходят.
А как синтасически это записать? никак ни могу понять

Добавлено через 13 минут
Цитата Сообщение от otto-fukin Посмотреть сообщение
Другое дело что это выглядит как извращение с непонятно какой целью.
цель - попытка сделать некий шаблон для комбинации вывода элементов массива описывающего товар, если вкратце

Добавлено через 17 минут
Цитата Сообщение от otto-fukin Посмотреть сообщение
ключом массива может быть любая скалярная переменная и null.
Хотя наверое вы меня не правильно поняли.
У массива обычные текстовые ключи.
PHP
1
$my_array['parameter_1']['value'] ... ['parameter_n']['value']
Просто чтобы описать некие действия с элементами массива, мне нужно записать эти имена ключей в текстовом виде (например в поле БД). В виде переменной я их привел для удобства восприятия.
И вот к этому элементу массива $my_array['parameter_1']['value'] мне нужно обратиться указав эти ключи из строкового значения переменной (т.к квадратные скобки в значении уже есть) т.е типа подстановки значения.
0
276 / 201 / 143
Регистрация: 22.01.2016
Сообщений: 637
08.12.2017, 00:44
Лучший ответ Сообщение было отмечено SergTN как решение

Решение

PHP
1
2
3
4
$my_array = [ 'parameter_1' => ['value' => 'text'] ];
$key = "['parameter_1']['value']";
 
eval("echo \$my_array$key;");
1
08.12.2017, 01:39

Не по теме:

Лучше переосмыслить этот подход и сделать по другому, в будущем еще не раз намучаетесь

0
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
08.12.2017, 20:01  [ТС]
Цитата Сообщение от mrNTF Посмотреть сообщение
eval("echo \$my_array$key;");
Так работает, спасибо!

Для чего нужен символ \ после echo ? Никогда не встречал такого с eval.
И еще тогда как запихнуть такую конструкцию в проверку наличия ключа:
PHP
1
 array_key_exists( то самое строковое значение $key , $my_array)
?
и еще у меня не получается присвоить результат такого eval() в переменную

Добавлено через 22 минуты
Цитата Сообщение от rodigy Посмотреть сообщение
Лучше переосмыслить этот подход и сделать по другому, в будущем еще не раз намучаетесь
согласен, что это косячный путь, но я не могу придумать, как описать порядок действий с элементами массива в строке. Либо придумывать какой-то шаблон и парсить его, либо написать как PHP код и вычислять его при помощи eval(). Лучше бы конечно третий путь)
0
 Аватар для rodigy
90 / 40 / 17
Регистрация: 24.10.2015
Сообщений: 577
08.12.2017, 22:12
Цитата Сообщение от SergTN Посмотреть сообщение
согласен, что это косячный путь, но я не могу придумать, как описать порядок действий с элементами массива в строке. Либо придумывать какой-то шаблон и парсить его, либо написать как PHP код и вычислять его при помощи eval(). Лучше бы конечно третий путь)
Ну вот и ищите способ(не исключая этот форум для вопроса описав более подробно задачу)
0
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
08.12.2017, 23:18  [ТС]
Цитата Сообщение от rodigy Посмотреть сообщение
Ну вот и ищите способ(не исключая этот форум для вопроса описав более подробно задачу)
Есть массив описывающий единицу товара. Например в одном случае это автомобиль, имеющий следующие характеристики
PHP
1
$my_array=array('parameter_1'=>array('title'=>'Двигатель', 'value'=>'бензиновый', 'unit'=>''), 'parameter_2'=>array('title'=>'Объем','value'=>'1500', 'unit'=>'см.куб'), 'parameter_3'=>array('title'=>'Мощность', 'value'=>'150', 'unit'=>'л.с'), 'parameter_4'=>array('title'=>'Кузов', 'value'=>'Седан', 'unit'=>'')  и.т.д другие данные)
Если я хочу вывести полные данные - просто вывожу массив. Если хочу показать сокращенные(компактную запись) то мне нужно объединить несколько элементов массива в один. Например Двигатель: Бензиновый,1500 см.куб, 150л.с.
Т.е. добавить к элементу:
PHP
1
 ['parameter_1']['value'] = ['parameter_1']['value'].', '.['parameter_2']['value'].','['parameter_1']['unit'].', '.['parameter_3']['value'].', '.['parameter_3']['unit']
Соответственно в Другой категории этот массив может содержать данные например о аккумуляторе:
PHP
1
$my_array=array('parameter_5'=>array('title'=>'напряжение', 'value'=>'12', 'unit'=>'в'), parameter_7=>array('title'=>'полярность', 'value'=>'прямая', 'unit'=>'')  итд  )
Здесь правило сокращенного вывода это например:
Напряжение 12в, прямая
PHP
1
['parameter_5']['value'] = ['parameter_5']['value'].' '.['parameter_5']['unit'].', '.['parameter_7']['value']
И так для разных товаров, где смысл ключей parameter_N различен. Для вывода хочу задать в поле таблицы БД (Mysql) с описанием раздела товара некое правило-шаблон такого вычисления для вывода сокращенных наименований. Как проще сделать не знаю)
0
 Аватар для rodigy
90 / 40 / 17
Регистрация: 24.10.2015
Сообщений: 577
09.12.2017, 16:36
SergTN, Если у вас параметры так и называются parameter_N, то все еще проще, Вам не нужны именованные параметры, просто можно использовать индексный двумерный массив.
PHP
1
$my_array=array(array('title'=>'Двигатель', 'value'=>'бензиновый', 'unit'=>''), array('title'=>'Объем','value'=>'1500', 'unit'=>'см.куб'));
Вывод:
- Все данные как и раньше вы делали
- короткая запись:
PHP
1
echo implode(',', array_map(function ($e) { return  $e['title'] . '  ' .  $e['unit']; }));
1
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
10.12.2017, 16:51  [ТС]
Цитата Сообщение от rodigy Посмотреть сообщение
Если у вас параметры так и называются parameter_N, то все еще проще, Вам не нужны именованные параметры, просто можно использовать индексный двумерный массив.
К этим параметрам в проекте привязано многое, сложно будет отказаться от них. К тому-же, в некоторых случаях, вместо индекса parameter_N, могут использоваться и другие индексы, например 'brand', 'model' итп.

Добавлено через 2 часа 21 минуту
Цитата Сообщение от mrNTF Посмотреть сообщение
eval("echo \$my_array$key;");
не могу понять что экранирует здесь слэш?
0
Эксперт PHP
4925 / 3920 / 1620
Регистрация: 24.04.2014
Сообщений: 11,441
10.12.2017, 16:54
Цитата Сообщение от SergTN Посмотреть сообщение
не могу понять что экранирует здесь слэш?
А есть варианты? Только следующий за ним символ
0
 Аватар для rodigy
90 / 40 / 17
Регистрация: 24.10.2015
Сообщений: 577
10.12.2017, 17:33
SergTN, да можно и такие параметры оставить, тоже работать будет
я раньше в коде немного неправильно описал работу array_map, посмотрите документацию, там еще масив нужно добавить
0
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
10.12.2017, 20:26  [ТС]
Цитата Сообщение от Jewbacabra Посмотреть сообщение
А есть варианты? Только следующий за ним символ
да понятно, что следующий) только я бы не догадался, что его надо сюда поставить. А без него не работает почему-то.

Добавлено через 3 минуты
Цитата Сообщение от rodigy Посмотреть сообщение
SergTN, да можно и такие параметры оставить, тоже работать будет
я раньше в коде немного неправильно описал работу array_map, посмотрите документацию, там еще масив нужно добавить
да, вторым аргументом, я догадался. Только эту конструкцию опять-таки надо прописывать индивидуально для каждого типа товара со своей последовательностью полей. И мы опять приходим к eval, если хранить это в поле БД. Или я не правильно уловил Вашу мысль?
0
 Аватар для rodigy
90 / 40 / 17
Регистрация: 24.10.2015
Сообщений: 577
10.12.2017, 20:42
Цитата Сообщение от SergTN Посмотреть сообщение
Только эту конструкцию опять-таки надо прописывать индивидуально для каждого типа товара
Нет, она для всех одинаковая, а как вы храните эти параметры в бд?
Цитата Сообщение от SergTN Посмотреть сообщение
со своей последовательностью полей.
Ну если нужно в определенном порядке, то можно добавить порядок сортировки для каждого параметра, или совсем переделать хранение в бд

Добавлено через 7 минут
Цитата Сообщение от SergTN Посмотреть сообщение
да понятно, что следующий) только я бы не догадался, что его надо сюда поставить.
http://php.net/manual/ru/language.types.string.php
0
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
10.12.2017, 22:41  [ТС]
Цитата Сообщение от rodigy Посмотреть сообщение
Нет, она для всех одинаковая, а как вы храните эти параметры в бд?
в отдельной таблице, связь по уникальному id. А дальше скрипт собирает это в массив. Сортировка у меня предусмотрена. В отдельном поле таблицы( с конфигурацией раздела), я перечисляю через запятую в нужном мне порядке имена параметров (brand, parameter_3, parameter_3 итд) порядок вывода - т.е "шаблон, образец" для сортировки этого массива. Вот теперь для нужно как-то описать порядок "сложения" параметров в один, использую некий шаблон. Но я склоняюсь все-же просто записать PHP код в строку таблицы и сделать eval. Тем более , что это надо сделать один раз для настройки отображения товара и в процессе работы он меняться не будет.
0
 Аватар для rodigy
90 / 40 / 17
Регистрация: 24.10.2015
Сообщений: 577
11.12.2017, 02:17
Лучший ответ Сообщение было отмечено SergTN как решение

Решение

Цитата Сообщение от SergTN Посмотреть сообщение
в процессе работы он меняться не будет.
Так все говорят, а потом приходиться что то менять...

А в чем сложность записать массив параметров в короткую строку используя ту же конфигурацию раздела?
Масив уже отсортирован, можно пройтись циклом проверяя название параметра и другие условия( бренд/не бренд и т.п.) или какой нибудь ф-цией для обхода массива.

Из тех примеров что вы написали, у вас получается не сложный шаблон для короткой строки, может если он сложнее, это может конечно не подойти
1
1 / 1 / 1
Регистрация: 18.09.2017
Сообщений: 153
11.12.2017, 19:24  [ТС]
Цитата Сообщение от rodigy Посмотреть сообщение
А в чем сложность записать массив параметров в короткую строку используя ту же конфигурацию раздела?
Вы правы! Я как-то зациклился на форме обращения к индексам value и unit, и упустил, что их в шаблон незачем и писать, достаточно только названия параметра, и в цикле проверить, если такой индекс есть, то добавляем соответющее значение элементов с индексом value и unit! и Никаких eval при этом не нужно! Спасибо))!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.12.2017, 19:24
Помогаю со студенческими работами здесь

Обращение к элементу массива через имя, а не индекс
Народ. Кто может сказать или дать ссылку на информацию как сделать так, чтобы можно было обращаться к элементу массива не через индекс,...

Обращение к элементу массива через ASM(Assembler)
Здравствуйте! Мне нужно написать программу, которая бы просто складывала бы все элементы массива, умноженные на 2(т.е. прибавлять каждый...

Не присваивается значение переменной элементу массива в модуле.
проблема такая, есть программа: uses modulx; begin init; {raschet znachenyi funkcii} rzf(xmax,x,y,n); {minimalnoe i...

Присвоить предыдущему элементу массива значение переменной
Присвоить предыдущему элементу массива p значение переменной yj и переадресовать указатель pv на этот элемент. что не верно?...

Обращение к классу через значение переменной, т.е. по имени в строковом представлении
К примеру есть переменная str типа string со значением "myClass". Как обратиться к классу myClass через значение этой переменной?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru