PHP массивы — функция типа ‘set where key =?’?

#php #arrays #multidimensional-array #foreach #logic

#php #массивы #многомерный массив #foreach #Логические

Вопрос:

Есть ли встроенная функция php, которая позволяет мне устанавливать значение массива на основе соответствующего ключа? Возможно, в последнее время я слишком много писал SQL, но я хотел бы выполнить следующую логику, не записывая вложенный массив foreach, например:

 foreach($array1 AS $k1 => $a1) {
    foreach($array2 AS $a2) {
         if($a1['id'] == $a2['id']) {
              $array[$k1]['new_key'] = $a2['value'];
         }
    }
}
  

Есть ли лучший способ сделать это? В логике SQL это было бы «SET array1.new_key = x ГДЕ array1.id = array2.id «. Опять же, в последнее время я слишком много пишу SQL: S

Комментарии:

1. Как бы то ни было, я не думаю, что это обновит исходный массив. Разве вам не пришлось бы изменить первый цикл, чтобы сказать amp;$a1 ?

2. @Jonathan Coe, то, что вы пытаетесь сделать, на самом деле не так тривиально, поэтому я сомневаюсь, что есть какой-либо встроенный способ сделать это.

3. @sdleihssirhc Вы правы, извините, я неправильно написал код … в моем фактическом коде я обновляю исходный массив, а не псевдоним, моя ошибка.

Ответ №1:

Когда мне нужно это сделать, я использую функцию для первого сопоставления значений одного массива по идентификатору:

 function convertArrayToMap(amp;$list, $attribute='id') {
    $result = array();
    foreach ($list as amp;$item) {
        if (is_array($item) amp;amp; array_key_exists($attribute, $item)) {
            $result[$item[$attribute]] = amp;$item;
        }
    }
    return $result;
}

$map = convertArrayToMap($array1);
  

Затем выполните итерацию по другому массиву и присвоите значения:

 foreach ($array2 AS $a2) {
     $id = $a2['id']; 
     $map[$id]['new_key'] = $a2['value'];
}
  

Это меньше циклов в целом даже за один проход, и это удобно для дальнейших операций в будущем.

Комментарии:

1. Ах… Мне это нравится. Конечно, не меньше кода, но более эффективный процесс определенно стоит дополнительных затрат.

2. Да, кроме того, если вы поместите вышеупомянутую функцию в библиотеку (как у меня), то при каждом ее использовании будет меньше кода.

3. Да, для меня это метод класса, просто пытаюсь упростить его. Вложенные циклы foreach обычно не являются лучшим способом для выполнения такого рода задач.

Ответ №2:

Это нормально и правильно

 foreach(amp;$array1 AS amp;$a1) {
    foreach($array2 AS $a2) {
         if($a1['id'] == $a2['id']) {
              $a1['new_key'] = $a2['value'];
         }
    }
}
  

Комментарии:

1. Разве это не должно быть foreach($array1 AS amp;$a1) { и foreach($array2 AS $a2) { ?

2. @Rocket: я думаю, что так и должно быть amp;$array1 as amp;$a1 , но, честно говоря, сейчас я не уверен

3. Уверен, что вам это не нужно amp;$array1 .

4. Это работает в любом случае 😉 Возможно, я занимаюсь здесь всем, но зачем вообще использовать amp; ? Это работает без него, это лучшая практика?

5. @JonathanCoe: Я сомневаюсь, что это работает. amp; перед $array гарантирует, что при изменении $a1 $array1 тоже изменится