Преобразование результата запроса на ключ=>значение пары для таблицы подстановки


Мое приложение имеет ряд подстановки таблиц, хранящихся в базе данных MySQL, которые используются для различных целей, таких как select элемент.

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

Например, при запросе одной из таблиц подстановки для всех значений, то вы получите массив такой:

 0 => ['level_id' => 1, 'level' => 'Trivial'],
 1 => ['level_id' => 2, 'level' => 'Moderate']
 2 => ['level_id' => 3, 'level' => 'Challenging'],
 3 => ['level_id' => 4, 'level' => 'Formidable']

Но для моих целей, это то, что я хочу:

 1 => 'Trivial',
 2 => 'Moderate',
 3 => 'Challenging',
 4 => 'Formidable'

(Обратите внимание, что ключи массива такие же, как и ID записи).

Если массив имеет более чем один дополнительный столбец, в результате будет содержаться в суб-массивы:

 3 => ['level' => 'Challenging', 'description' => 'Foobar'],
 4 => ['level' => 'Formidable', 'description' => 'Bazbat']

Это все очень тривиально, но я написал эту функцию, что я хотел бы рассмотреть, чтобы знать, если есть лучший способ сделать это в PHP.

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

<?php
// Turn an array into a key=>value pair. Assumes the key is the first item in the sub-array.
public function column_into_keys(array $array): array {

    // get the name of the column that contains the record id
    $key = key($array[0]);

    foreach($array as $row) {

        // pop the new key off the top of the array
        $id = array_shift($row);

        // is there only one item left in the array?
        if (count($row) == 1)
            // get the first value
            $result[$id] = current($row);
        else
            // get all of the values
            $result[$id] = $row;
    }

    return $result;
}


313
5
задан 5 апреля 2018 в 07:04 Источник Поделиться
Комментарии
2 ответа

Учитывая, что вы работаете с PHP, нет никаких причин пренебрегать такой особенностью, которая уже существует в языке.

Например, при запросе одной из таблиц подстановки для всех значений

$data = $pdo->query("SELECT * FROM lookup")->fetchAll(PDO::FETCH_KEY_PAIR);

вы получаете массив такой:

 1 => 'Trivial',
2 => 'Moderate',
3 => 'Challenging',
4 => 'Formidable'

всем спасибо ПДО::FETCH_KEY_PAIR режима извлечения.

Конечно, это работает только с PDO, но вы должны в любом случае использовать этот драйвер.

3
ответ дан 6 апреля 2018 в 01:04 Источник Поделиться

Попробуйте это:

$finalResult=[];
array_map(function ($value) use (&$finalResult){
$result = array_values($value);
return $finalResult[$result[0]] = $result[1];
}, $array);

return $finalResult;

Я стараюсь избегать форс как можно больше и полагаться на собственных функций. Я начал делать это, так как я прочитала книгу рефакторинг в коллекции. Это улучшило мой код и скорость моего кода.

Встроенные функции записываются в память эффективный способ.

Функция внутри использование array_map называется закрытие. Вы можете осуществить закрытие в любое время, что вам нужно сделать быстрые вычисления локально.

Ваше решение делает нужную работу, но выглядит немного неаккуратно. Я не думаю, что будет проблема с тем, что хоть у вас есть.

Редактировать:

 $array = [
0 => ['level_id' => 1, 'level' => 'Trivial', 'description' => 'Foobar'],
1 => ['level_id' => 2, 'level' => 'Moderate', 'description' => 'Foobar'],
2 => ['level_id' => 3, 'level' => 'Challenging', 'description' => 'Foobar'],
3 => ['level_id' => 4, 'level' => 'Formidable'],
];

С помощью этого:

$finalResult = [];
array_map(function ($value) use (&$finalResult) {
$result = array_values($value);
return sizeof($result) == 2 ?
$finalResult[$result[0]] = $result[1]
: $finalResult[$result[0]] = array_slice($value, 0, sizeof($value) - 1);
}, $array);

Вы всегда получите правильный ответ независимо от того, сколько столбцов у вас есть или сколько комбинаций у вас есть.


  • оператор sizeof($результат) == 2 ? $finalResult[$результат[0]] = $результат[1] если ТЭН массив имеет 2 записи использовать первый в качестве идентификатора и второго, так как значение

  • $finalResult[$результат[0]] = array_slice($значение, 0, оператор sizeof($значение) - 1); // Если в ней больше 2 записей 2 записей затем снять первую (array_slice($значение, 0, оператор sizeof($значение) - 1)). Это не распространяется на случай, когда есть только одна запись, а не ваша. Нам следует учесть что так же, как этот:

возвращать sizeof($результат) == 2 ?
$finalResult[$результат[0]] = $результат[1]
: оператор sizeof($результат) > 2 ? $finalResult[$результат[0]] = array_slice($значение, 0, оператор sizeof($значение) - 1) : [];

Теперь на вопрос:

Чего делает, в основном перебора каждого элемента массива (неважно, сколько) и что-то делать с этим. В идеале, родной функции использовать адреса памяти, чтобы найти один элемент за раз, что-то с ней и освободить память. Я в идеале сказал, потому что иногда тот, кто писать код через супостата за ним. Я постараюсь написать в блоге об этом, потому что это звучит как большой вопрос.

В основном, что я могу сказать после 12 лет программирования заключается в том, что вы учитесь на собственном опыте. А вы обычно узнаете, когда что-то не получается. Я узнал, что мой урок с На после сервере с 503( были проблемы с тайм-аута), когда мой дБ нужно ~1 мил записей.

Это здорово, что вы хотите учиться и совершенствоваться и я думаю, что если вы придерживаться того, что вы делаете ты собираешься попасть туда. Просто не бойтесь испытать и попробовать другие вещи. Всякий раз, когда у меня похожая проблема, я иду к руководству и проверить, что я могу использовать. Если нет такой функции в инструкции я добавить его в мой файл helpers (что не везде) и попробовать его с большим количеством данных. Если это не удается мне вернуться и попробовать другие варианты.

2
ответ дан 5 апреля 2018 в 08:04 Источник Поделиться