Возврат массива пропущенных значений - PullRequest
1 голос
/ 25 марта 2020

Я создал метод, который создает список элементов, но не каждое значение заполняется. Я пробовал несколько способов, но ни один из них не решил проблему. Я играл с заявлениями if else, но это не исправило результат. Я все еще получаю меньше значений, чем я ожидаю. Может ли кто-нибудь дать мне подсказку или переписать мой метод, чтобы я мог go вернуться к своему проекту.

Метод:

public function getDataListItems(int $category, array $list) 
{
    global $dbh;

    $query = 'SELECT data.value, data.uid, fields.name 
              FROM data 
                JOIN fields ON data.field_id = fields.id 
              WHERE fields.category_id = "' . trim($category) . 
            '" ORDER BY uid';

    $sql = $dbh->prepare($query);
    $sql->execute();
    $values = $sql->fetchAll(PDO::FETCH_ASSOC);

    $data = '';
    $items = [];
    foreach ($values as $value) {
        foreach ($list as $key) {
            if(!empty($data)){
                if($data == $value['uid']) {
                    if($key == $value['name']) {
                        $item = [
                            $value['name'] => $value['value'],
                            'uid' => $value['uid'],
                        ];
                    }else{
                        $item = [
                            $key => '',
                            'uid' => $value['uid'],
                        ];          
                    }
                    $items[$value['uid']] = array_merge($items[$value['uid']], $item);
                }else{
                    if($key == $value['name']) {
                        $items[$value['uid']] = [
                            $value['name'] => $value['value'],
                            'uid' => $value['uid'],
                        ];  
                    }else{
                        $items[$value['uid']] = [
                            $key => '',
                            'uid' => $value['uid'],
                        ];          
                    }       
                }
            }else{
                if($key == $value['name']) {
                    $items[$value['uid']] = [
                        $value['name'] => $value['value'],
                        'uid' => $value['uid'],
                    ];  
                }else{
                    $items[$value['uid']] = [
                        $key => '',
                        'uid' => $value['uid'],
                    ];          
                }       
            }
            $data = $value['uid'];
        }
    }
    return $items;  
}

В $list вы найдете:

array(3) {
  ["Voornaam"]=> string(8) "Voornaam"
  ["Achternaam"]=> string(10) "Achternaam"
  ["Initialen"]=> string(9) "Initialen"
}

в $values вы найдете:

array(7) {
  [0]=>
  array(3) {
    ["value"]=> string(7) "Bettina"
    ["uid"]=> string(15) "7d1f4f8e906245f"
    ["name"]=> string(8) "Voornaam"
  }
  [1]=>
  array(3) {
    ["value"]=> string(3) "Les"
    ["uid"]=> string(15) "7d1f4f8e906245f"
    ["name"]=> string(10) "Achternaam"
  }
  [2]=>
  array(3) {
    ["value"]=> string(6) "Simone"
    ["uid"]=> string(15) "7d1f4f8e906245g"
    ["name"]=> string(8) "Voornaam"
  }
  [3]=>
  array(3) {
    ["value"]=> string(4) "Yül"
    ["uid"]=> string(15) "7d1f4f8e906245l"
    ["name"]=> string(10) "Achternaam"
  }
  [4]=>
  array(3) {
    ["value"]=> string(6) "Joshua"
    ["uid"]=> string(15) "7d1f4f8e906245s"
    ["name"]=> string(8) "Voornaam"
  }
  [5]=>
  array(3) {
    ["value"]=> string(3) "Mas"
    ["uid"]=> string(15) "7d1f4f8e906245s"
    ["name"]=> string(10) "Achternaam"
  }
  [6]=>
  array(3) {
    ["value"]=> string(5) "Hello"
    ["uid"]=> string(15) "gGcYEJdRYJ1vqcn"
    ["name"]=> string(10) "Achternaam"
  }
}

что я получаю в ответе:

["7d1f4f8e906245f"]=>
  array(4) {
    ["Voornaam"]=> string(0) ""
    ["uid"]=> string(15) "7d1f4f8e906245f"
    ["Achternaam"]=> string(3) "Les"
    ["Initialen"]=> string(0) ""
  }
["7d1f4f8e906245g"]=>
  array(4) {
    ["Voornaam"]=> string(6) "Simone"
    ["uid"]=> string(15) "7d1f4f8e906245g"
    ["Achternaam"]=> string(0) ""
    ["Initialen"]=> string(0) ""
  }
["7d1f4f8e906245l"]=>
  array(4) {
    ["Voornaam"]=> string(0) ""
    ["uid"]=> string(15) "7d1f4f8e906245l"
    ["Achternaam"]=> string(4) "Yül"
    ["Initialen"]=> string(0) ""
  }
  ["7d1f4f8e906245s"]=>
  array(4) {
    ["Voornaam"]=> string(0) ""
    ["uid"]=> string(15) "7d1f4f8e906245s"
    ["Achternaam"]=> string(3) "Mas"
    ["Initialen"]=> string(0) ""
  }
  ["gGcYEJdRYJ1vqcn"]=>
  array(4) {
    ["Voornaam"]=> string(0) ""
    ["uid"]=> string(15) "gGcYEJdRYJ1vqcn"
    ["Achternaam"]=> string(5) "Hello"
    ["Initialen"]=> string(0) ""
  }
}

Что я ожидаю, массив результатов:

    ["7d1f4f8e906245f"]=>
  array(4) {
    ["Voornaam"]=> string(0) "Bettina"
    ["uid"]=> string(15) "7d1f4f8e906245f"
    ["Achternaam"]=> string(3) "Les"
    ["Initialen"]=> string(0) ""
  }
["7d1f4f8e906245g"]=>
  array(4) {
    ["Voornaam"]=> string(6) "Simone"
    ["uid"]=> string(15) "7d1f4f8e906245g"
    ["Achternaam"]=> string(0) ""
    ["Initialen"]=> string(0) ""
  }
["7d1f4f8e906245l"]=>
  array(4) {
    ["Voornaam"]=> string(0) ""
    ["uid"]=> string(15) "7d1f4f8e906245l"
    ["Achternaam"]=> string(4) "Yül"
    ["Initialen"]=> string(0) ""
  }
  ["7d1f4f8e906245s"]=>
  array(4) {
    ["Voornaam"]=> string(0) "Joshua"
    ["uid"]=> string(15) "7d1f4f8e906245s"
    ["Achternaam"]=> string(3) "Mas"
    ["Initialen"]=> string(0) ""
  }
  ["gGcYEJdRYJ1vqcn"]=>
  array(4) {
    ["Voornaam"]=> string(0) ""
    ["uid"]=> string(15) "gGcYEJdRYJ1vqcn"
    ["Achternaam"]=> string(5) "Hello"
    ["Initialen"]=> string(0) ""
  }
}

Вы видите, что я пропускаю некоторые значения в моем списке возврата.

Ответы [ 3 ]

1 голос
/ 25 марта 2020

Вы хотите сгруппировать результаты на основе значений uid и установить некоторые значения по умолчанию - это можно сделать без стольких условий. Используйте isset(), чтобы определить, встречается ли uid впервые. Если это так, установите значения по умолчанию. Затем перезаписывайте значения по умолчанию при каждом последующем столкновении для того же uid.

Код: ( Демо )

$values = [
    ['value' => 'Bettina', 'uid' =>  '7d1f4f8e906245f', 'name' => 'Voornaam'],
    ['value' => 'Les', 'uid' =>  '7d1f4f8e906245f', 'name' =>  'Achternaam'],
    ['value' => 'Simone', 'uid' =>  '7d1f4f8e906245g', 'name' => 'Voornaam'],
    ['value' => 'Yül', 'uid' =>  '7d1f4f8e906245l', 'name' =>  'Achternaam'],
    ['value' => 'Joshua', 'uid' =>  '7d1f4f8e906245s', 'name' => 'Voornaam'],
    ['value' => 'Mas', 'uid' =>  '7d1f4f8e906245s', 'name' =>  'Achternaam'],
    ['value' => 'Hello', 'uid' =>  'gGcYEJdRYJ1vqcn', 'name' =>  'Achternaam'],
];

$list = ['Voornaam', 'Achternaam', 'Initialen'];

foreach ($values as $row) {
    if (!isset($items[$row['uid']])) {
        $items[$row['uid']] = array_fill_keys($list, '');  // if it needs to dynamically generated
        $items[$row['uid']]['uid'] = $row['uid'];
    }
    $items[$row['uid']][$row['name']] = $row['value'];
}

var_export($items);

Выход:

array (
  '7d1f4f8e906245f' => 
  array (
    'Voornaam' => 'Bettina',
    'Achternaam' => 'Les',
    'Initialen' => '',
    'uid' => '7d1f4f8e906245f',
  ),
  '7d1f4f8e906245g' => 
  array (
    'Voornaam' => 'Simone',
    'Achternaam' => '',
    'Initialen' => '',
    'uid' => '7d1f4f8e906245g',
  ),
  '7d1f4f8e906245l' => 
  array (
    'Voornaam' => '',
    'Achternaam' => 'Yül',
    'Initialen' => '',
    'uid' => '7d1f4f8e906245l',
  ),
  '7d1f4f8e906245s' => 
  array (
    'Voornaam' => 'Joshua',
    'Achternaam' => 'Mas',
    'Initialen' => '',
    'uid' => '7d1f4f8e906245s',
  ),
  'gGcYEJdRYJ1vqcn' => 
  array (
    'Voornaam' => '',
    'Achternaam' => 'Hello',
    'Initialen' => '',
    'uid' => 'gGcYEJdRYJ1vqcn',
  ),
)

По правде говоря, если бы это было мое приложение, я бы написал сводный запрос и сделал бы все это в sql, чтобы значение fetchAll() могло быть немедленно возвращено.

1 голос
/ 25 марта 2020

Вы использовали uid в качестве ключа для нового массива. Но у вас есть более одного вхождения в исходном массиве одного и того же uid

Этот 7d1f4f8e906245f и этот 7d1f4f8e906245s встречаются дважды.

Поэтому ваш l oop будет перезаписать первое вхождение, которое вы создали в результате, вторым.

Вам придется переосмыслить то, что вы хотите использовать в качестве ключа для вашего нового массива. По сути, ваш uid (UniqueId) не уникален в этом случае

0 голосов
/ 25 марта 2020

Совершенно отдельное / альтернативное решение (которое я рекомендую, если ваше приложение не должно быть полностью динамическим c) - это выполнить все логики обработки c в самом раннем пункте - в sql.

Использование сводки позволит вам быстро go от запроса к возвращенному набору результатов в оснастке.

Запрос: ( ДБ-fiddle Demo )

SELECT 
    MAX(IF(fields.name = 'Voornaam', data.value, '')) AS Voornaam,
    data.uid,
    MAX(IF(fields.name = 'Achternaam', data.value, '')) AS Achternaam,
    MAX(IF(fields.name = 'Initialen', data.value, '')) AS Initialen
FROM data 
JOIN fields ON data.field_id = fields.id 
WHERE fields.category_id = 1
GROUP BY data.uid ASC

Набор результатов:

| Voornaam | Achternaam | Initialen | uid             |
| -------- | ---------- | --------- | --------------- |
| Bettina  | Les        |           | 7d1f4f8e906245f |
| Simone   |            |           | 7d1f4f8e906245g |
|          | Yül        |           | 7d1f4f8e906245l |
| Joshua   | Mas        |           | 7d1f4f8e906245s |
|          | Hello      |           | gGcYEJdRYJ1vqcn |

Код:

public function getDataListItems(int $category, array $list) 
{
    global $dbh;

    $query = "SELECT 
                  MAX(IF(fields.name = 'Voornaam', data.value, '')) AS Voornaam,
                  data.uid,
                  MAX(IF(fields.name = 'Achternaam', data.value, '')) AS Achternaam,
                  MAX(IF(fields.name = 'Initialen', data.value, '')) AS Initialen
              FROM data 
              JOIN fields ON data.field_id = fields.id 
              WHERE fields.category_id = ?
              GROUP BY data.uid ASC";
    $sql = $dbh->prepare($query);
    $sql->execute($category);
    return $sql->fetchAll(PDO::FETCH_ASSOC);  // this will be an indexed array of associative arrays
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...