Организация и фильтрация сложного и случайного ассоциативного / многомерного массива - PullRequest
0 голосов
/ 11 июня 2019

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

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

Мои цели:

  1. Переименуйте первичный индекс из хэшей, которые присутствуют сейчас, просто в 0,1,2 ...
  2. Удалить ВСЕ массивы, в которых нет ключа "roleID"
  3. Суммируйте все итоговые значения 'часов' в оставшихся массивах, а затем добавьте новый ключ с именем "totalHours", который будет иметь значение итоговой суммы часов за этот конкретный массив.

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

Причина, по которой ключи в «часах» так неудобны, связана с тем, как я получаю часы из базы данных. Я не могу искать на основе пользователя.

Array
(
    [5b6468a500277c71b98405b1f140991c] => Array
        (
            [roleID] => 5b6468a500277c71b98405b1f140991c
            [ID] => 5b6468a500277c71b98405b1f140991c
            [name] => CED
            [rateValue] => 10
            [hours] => Array
                (
                    [23] => 0.25
                    [36] => 0.5
                    [38] => 0.5
                    [43] => 0.5
                    [53] => 0.5
                    [57] => 1
                    [60] => 1
                    [61] => 1
                    [62] => 1
                    [63] => 1
                    [64] => 1
                    [66] => 1
                    [71] => 2
                    [73] => 2.5
                    [79] => 7.5
                )

        )

    [5b6468a500277c74f6b2c065436b7d17] => Array
        (
            [roleID] => 5b6468a500277c74f6b2c065436b7d17
            [ID] => 5b6468a500277c74f6b2c065436b7d17
            [name] => ADR
            [rateValue] => 100
            [hours] => Array
                (
                    [4] => 0.25
                    [76] => 3
                )

        )

    [5b6468a500277c80b63cfcc15c2dacf2] => Array
        (
            [ID] => 5b6468a500277c80b63cfcc15c2dacf2
            [name] => DST
            [rateValue] => 195
        )


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

Array
(
// changed from hash to '0'
    [0] => Array
        (
            [roleID] => 5b6468a500277c71b98405b1f140991c
            [ID] => 5b6468a500277c71b98405b1f140991c
            [name] => CED
            [rateValue] => 10
            [hours] => Array
                (
                    [23] => 0.25
                    [36] => 0.5
                    [38] => 0.5
                )

        )

    [1] => Array
        (
            [roleID] => 5b6468a500277c74f6b2c065436b7d17
            [ID] => 5b6468a500277c74f6b2c065436b7d17
            [name] => ADR
            [rateValue] => 100
            [hours] => Array
                (
                    [4] => 0.25
                    [76] => 3
                )

        )

    [2] => Array
        (
            [ID] => 5b6468a500277c80b63cfcc15c2dacf2
            [name] => DST
            [rateValue] => 195
        )

Тогда во втором выглядеть так (при необходимости)

Array
(
    [0] => Array
        (
            [roleID] => 5b6468a500277c71b98405b1f140991c
            [ID] => 5b6468a500277c71b98405b1f140991c
            [name] => CED
            [rateValue] => 10
// hours array keys changed for simpler addition (if you think this is necessary)

            [hours] => Array
                (
                    [0] => 0.25
                    [1] => 0.5
                    [2] => 0.5
                )

        )

    [1] => Array
        (
            [roleID] => 5b6468a500277c74f6b2c065436b7d17
            [ID] => 5b6468a500277c74f6b2c065436b7d17
            [name] => ADR
            [rateValue] => 100
            [hours] => Array
                (
                    [0] => 0.25
                    [1] => 3
                )

// index 2 in step 1 deleted because it does not have the roleID key/value

        )

Тогда в третьем должно выглядеть так:


Array
(
    [0] => Array
        (
            [roleID] => 5b6468a500277c71b98405b1f140991c
            [ID] => 5b6468a500277c71b98405b1f140991c
            [name] => CED
            [rateValue] => 10
            [hours] => Array
                (
                    [0] => 0.25
                    [1] => 0.5
                    [2] => 0.5
                )

        )

    [1] => Array
        (
            [roleID] => 5b6468a500277c74f6b2c065436b7d17
            [ID] => 5b6468a500277c74f6b2c065436b7d17
            [name] => ADR
            [rateValue] => 100
            [hours] => Array
                (
                    [0] => 0.25
                    [1] => 3
                )

//third element deleted because it does not have the roleID key/value

        )

Тогда наконец:

Array
(
    [0] => Array
        (
            [roleID] => 5b6468a500277c71b98405b1f140991c
            [ID] => 5b6468a500277c71b98405b1f140991c
            [name] => CED
            [rateValue] => 10
            [hours] => Array
                (
                    [0] => 0.25
                    [1] => 0.5
                    [2] => 0.5
                )
            [totalHours] => 1.25

        )

    [1] => Array
        (
            [roleID] => 5b6468a500277c74f6b2c065436b7d17
            [ID] => 5b6468a500277c74f6b2c065436b7d17
            [name] => ADR
            [rateValue] => 100
            [hours] => Array
                (
                    [0] => 0.25
                    [1] => 3
                )
            [totalHours] => 3.25


        )

1 Ответ

0 голосов
/ 11 июня 2019
  1. Может быть сделано с array_values ( документация ), но также просто добавить элемент в массив будет использовать ключи int
  2. Простой foreach с проверкой isset ( документация )
  3. array_sum на помощь ( документация )

Рассмотрим следующий простой псевдокод:

foreach($array as $e) {
    if (isset["roleID"]) {
        $e["totalHours"] = array_sum($e["hours"]);
        unset($e["hours"]); // only if you don't want it anymore 
        $res[] = $e;
    }
}

и что это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...