PHP: Преобразовать массив в индексированный массив

#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 и делает его ключом верхнего уровня.