#php #arrays #associative-array
#php #массивы #ассоциативный массив
Вопрос:
Учитывая, что у меня есть простой неассоциативный массив $values
из SomeObject
элементов, индексированных 0, 1, 2 и т.д.
Какой наилучший синтаксис для построения ассоциативного массива, $valuesByIndex
индексируемого некоторым значением, извлеченным из исходных элементов?
То, что я создал, это:
$key = function($val) {
return $val->getSomeProperty();
};
$valuesByIndex = array_combine(array_map($key, $values), $values);
Что в значительной степени равно:
$key = function($val) {
return $val->getSomeProperty();
};
$valuesByIndex = [];
foreach ($values as $val) {
$valuesByIndex[$key($val)] = $val;
}
Ищу довольно компактный синтаксис.
Комментарии:
1.
indexed by some value extracted from original items
Я понятия не имею, что это такое, некоторые примеры данных были бы хороши. (если это var_export ) Если нет, я думаю, я могу его преобразовать….2. Похоже, с вашим кодом проблем нет. Если вы ищете code review, то ваш вопрос больше подошел бы для CodeReview
3. Мне это не нравится,
$val->getSomeProperty
это подразумевает, чтоgetSomeProperty
известно. Вы могли бы сделать что-то вроде$valuesByIndex[$val->getSomeProperty()] = $val;
во втором примере. Например. Или, что более вероятно,$valuesByIndex[$val->{foo}] = $val;
и т.д. Но повторное использование переменных$valuesByIndex[$val->getSomeProperty()] = $val
имеет мало смысла, если$val
это объект. Итак, вы устанавливаете некоторый элемент массива с ключом чего бы то ни было$val->getSomeProperty()
для объекта$val
4. Может быть, это и правильно, но, видите ли, у меня нет способа узнать без каких-либо входных / выходных данных. Мне это просто кажется странным.
5. В любом случае, в вашем втором примере это то же самое, что и моя точка зрения
foreach ($values as $val) $valuesByIndex[$val->getSomeProperty()] = $val;
, и в этом случае вы можете сделатьarray_map(function($val) use (amp;$valuesByIndex){ $valuesByIndex[$val->getSomeProperty()] = $val; });
Ответ №1:
В этой части:
$key = function($val) {
return $val->getSomeProperty();
};
$valuesByIndex = [];
foreach ($values as $val) {
$valuesByIndex[$key($val)] = $val;
}
Мы можем просто заменить $key($val)
содержимым функции $val->getSomeProperty()
, которая дает нам
$valuesByIndex = [];
foreach ($values as $val) $valuesByIndex[$val->getSomeProperty()] = $val;
Потому что, если функция возвращает это $val->getSomeProperty()
, мы можем просто поместить это прямо туда и полностью отказаться от этой функции.
Однако, если это из вызова DB, вы можете использовать (в PDO) PDO::FETCH_GROUP
, который принимает первый столбец Select и делает его ключом верхнего уровня.