сравнить одно поле из массива объектов - PullRequest
0 голосов
/ 15 ноября 2018

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

Пока все хорошо, я создал свои функции для передачи данных между PHP и javascript. Однако, хотя массив json, который javascript отправляет в PHP, содержит всю информацию о продуктах (так как javascript необходим для его извлечения, чтобы заполнить сетку в графическом интерфейсе), мне все равно нужно проверить все в PHP, потому что я не могу убедитесь, что пользователь не вмешивался в данные с консоли, прежде чем пытаться сохранить.

С учетом сказанного в PHP я получаю массив json, который я использую по идентификаторам, чтобы загрузить список подходящих объектов в массив. Я делаю это:

$in  = str_repeat('?,', count($itemIDs) - 1) . '?';
$sql = "SELECT * FROM tbProduct WHERE nID IN ($in)";
$sttmt = $db->prepare($sql);
$sttmt->execute($itemIDs);

$res = $sttmt->fetchAll(PDO::FETCH_ASSOC);

foreach ($res as $key => $productInfo) {
    $prod = new tbProduct($db);
    $prod->loadFromArray($productInfo);
}

пока все хорошо, у меня теперь есть массив tbProduct, который является моим классом для продуктов.

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

Так что мне нужен способ проверить это. Я мог бы просто сделать foreach, сохранить все, что нужно проверить с самого первого элемента в переменных, и просто сравнить каждый последующий элемент с этими переменными, но я уверен, что есть лучшие способы сделать это. Мне нужно что-то, что будет максимально эффективно. Мои пакеты могут (и будут) содержать несколько сотен продуктов, поэтому решение должно быть быстрым.

Каков наилучший способ сделать это?

Спасибо!

1 Ответ

0 голосов
/ 15 ноября 2018

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

$res = $sttmt->fetchAll(PDO::FETCH_ASSOC);

$firstprod = new tbProduct($db);
$firstprod->loadFromArray(array_shift($res));

foreach ($res as $key => $productInfo) {
    $prod = new tbProduct($db);
    $prod->loadFromArray($productInfo);
    if ($prod->status != $firstprod->status) {
        // report inconsistent status
    } elseif ($prod->owner != $firstprod->owner) {
        // report inconsistent owner
    } elseif ($prod->type != "assembly") {
        // report that it must ba an assembly part
    } ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...