Фильтр массива
Привет, есть код:
$i = 1;
foreach ($data as $employeeid => $rows) {
sort($rows);
foreach ($rows as $row) {
echo $i++.'. ';
echo $row['Tool1Identifier'].' ';
echo $row['Tool2Identifier'].'<br>';
}
}
Он показывает следующее: ![]() Если в двух словах, то человек работает с двумя позициями. На одной позиции один номер или пусто. Нужно подсчитать каждую замену номера на позиции. Типа вот так: ![]() Всего: 6 |
Цитата:
|
![]() |
Откуда эти данные и как они связаны?
|
И каким боком тут раздел "Элементы интерфейса"? :blink:
|
Sav2907,
не легче ... что это за данные (массив?) и что такое замена позиции? Цитата:
|
рони,
Массив. 1-13 номер заказа. 1 заказ: заказ делался одним номером (257). 2 заказ: 257 и 258 3 тем и другим Результат: 1 заказ одна замена 2 заказ одна замена 3 ни одной |
Sav2907,
откуда эти данные, где хранятся? |
laimas,
выборка из БД. Полный код:
<?php
$shiftStart = new DateTime('2016-12-27 06:00:00');
$shiftEnd = new DateTime('2016-12-27 12:00:00');
$server = qqG3Server_Init('SEUA_SAV', 90);
if (!qqG3Server_Connected($server)) die('Can\'t connect to SEUA_SAV');
$clip = qqG3Server_NewClip($server, 'SDA', 0);
$view = qqG3Clip_NewView($clip, 0);
qqG3View_BeginAND($view);
qqG3View_Long($view, 10, 0, 'ActWorkStation', 1);
qqG3View_Long($view, 9, 0, 'ActWorkStation', 50);
qqG3View_Utime($view, 9, 0, 'ActualStartCaoDtZt', $shiftEnd->format('U'));
qqG3View_Utime($view, 9, 0, 'ActualEndCaoDtZt', $shiftEnd->format('U'));
qqG3View_Long($view, 5, 0, 'PersonnelNo', 601);
qqG3View_BeginOR($view);
qqG3View_Utime($view, 10, 0, 'ActualStartCaoDtZt', $shiftStart->format('U'));
qqG3View_Utime($view, 10, 0, 'ActualEndCaoDtZt', $shiftStart->format('U'));
qqG3View_End($view);
qqG3View_End($view);
qqG3View_BeginFetch($view);
if (qqG3View_Count($view) > 0) {
$data = array();
while ($tuple = qqG3View_Fetch($view)) {
$employeeid = qqG3Tuple_GetLong($tuple, 0, 'PersonnelNo');
if (!array_key_exists($employeeid, $data)) $data[$employeeid] = array();
array_push($data[$employeeid], array(
'ActualStartCaoDtZt' => date('Y-m-d H:i:s', qqG3Tuple_GetUtime($tuple, 0, 'ActualStartCaoDtZt')),
'ActualEndCaoDtZt' => date('Y-m-d H:i:s', qqG3Tuple_GetUtime($tuple, 0, 'ActualEndCaoDtZt')),
'Tool1Identifier' => qqG3Tuple_GetString($tuple, 0, 'Tool1Identifier'),
'Tool2Identifier' => qqG3Tuple_GetString($tuple, 0, 'Tool2Identifier')
));
}
sort($data);
$i = 1;
foreach ($data as $employeeid => $rows) {
sort($rows);
foreach ($rows as $row) {
echo $i++.'. ';
echo $row['Tool1Identifier'].' ';
echo $row['Tool2Identifier'].'<br>';
}
}
}
qqG3View_EndFetch($view);
qqG3View_Destroy($view);
qqG3Clip_Destroy($clip);
qqG3Server_Destroy($server);
?>
|
Я не знаю такого sql-сервера, но если в нем данные описаны по уму, имеют связи, то все что вы пытаетесь получить, получают в рамках sql-запроса.
|
Sav2907,
массив этот напишите js var arr = [....]; |
Array
(
[0] => Array
(
[ActualStartCaoDtZt] => 2016-12-27 06:01:11
[ActualEndCaoDtZt] => 2016-12-27 06:35:16
[Tool1Identifier] => 257
[Tool2Identifier] =>
)
[1] => Array
(
[ActualStartCaoDtZt] => 2016-12-27 06:38:32
[ActualEndCaoDtZt] => 2016-12-27 06:48:02
[Tool1Identifier] => 257
[Tool2Identifier] => 258
)
[2] => Array
(
[ActualStartCaoDtZt] => 2016-12-27 06:53:46
[ActualEndCaoDtZt] => 2016-12-27 06:59:50
[Tool1Identifier] => 257
[Tool2Identifier] => 258
)
[3] => Array
(
[ActualStartCaoDtZt] => 2016-12-27 07:01:30
[ActualEndCaoDtZt] => 2016-12-27 07:06:41
[Tool1Identifier] => 258
[Tool2Identifier] => 257
)
[4] => Array
(
[ActualStartCaoDtZt] => 2016-12-27 07:08:44
[ActualEndCaoDtZt] => 2016-12-27 08:04:59
[Tool1Identifier] => 258
[Tool2Identifier] =>
)
[5] => Array
(
[ActualStartCaoDtZt] => 2016-12-27 08:05:25
[ActualEndCaoDtZt] => 2016-12-27 09:02:06
[Tool1Identifier] => 257
[Tool2Identifier] =>
)
[6] => Array
(
[ActualStartCaoDtZt] => 2016-12-27 09:05:44
[ActualEndCaoDtZt] => 2016-12-27 09:28:44
[Tool1Identifier] => 257
[Tool2Identifier] => 35
)
[7] => Array
(
[ActualStartCaoDtZt] => 2016-12-27 09:30:28
[ActualEndCaoDtZt] => 2016-12-27 09:52:36
[Tool1Identifier] => 257
[Tool2Identifier] => 35
)
[8] => Array
(
[ActualStartCaoDtZt] => 2016-12-27 09:55:32
[ActualEndCaoDtZt] => 2016-12-27 10:12:05
[Tool1Identifier] => 258
[Tool2Identifier] => 257
)
[9] => Array
(
[ActualStartCaoDtZt] => 2016-12-27 10:13:28
[ActualEndCaoDtZt] => 2016-12-27 10:22:48
[Tool1Identifier] => 258
[Tool2Identifier] => 257
)
[10] => Array
(
[ActualStartCaoDtZt] => 2016-12-27 10:26:21
[ActualEndCaoDtZt] => 2016-12-27 10:43:00
[Tool1Identifier] => 257
[Tool2Identifier] => 248
)
[11] => Array
(
[ActualStartCaoDtZt] => 2016-12-27 10:44:36
[ActualEndCaoDtZt] => 2016-12-27 10:55:28
[Tool1Identifier] => 248
[Tool2Identifier] => 257
)
[12] => Array
(
[ActualStartCaoDtZt] => 2016-12-27 11:27:57
[ActualEndCaoDtZt] => 2016-12-27 11:44:02
[Tool1Identifier] => 247
[Tool2Identifier] => 257
)
)
|
Sav2907,
напишите массив массивом var arr = [[257,],[257,258]... и т.д.] |
рони,
var arr = [[257,],[257,258],[257,258],[258,257],[258,],[257,],[257,35],[257,35],[258,257],[258,257],[257,248],[248,257],[247,257]]; |
Цитата:
|
Или так правильнее:
var array = {
"data": {
"0": {
"Tool1Identifier": [ "257" ],
"Tool2Identifier": [ "" ]
},
"1": {
"Tool1Identifier": [ "257" ],
"Tool2Identifier": [ "258" ]
},
"2": {
"Tool1Identifier": [ "257" ],
"Tool2Identifier": [ "258" ]
},
"3": {
"Tool1Identifier": [ "258" ],
"Tool2Identifier": [ "257" ]
},
"4": {
"Tool1Identifier": [ "258" ],
"Tool2Identifier": [ "" ]
},
"5": {
"Tool1Identifier": [ "257" ],
"Tool2Identifier": [ "" ]
},
"6": {
"Tool1Identifier": [ "257" ],
"Tool2Identifier": [ "35" ]
}
}
};
рони, Потому что эти номера уже установлены на позициях, просто не используются оба |
Sav2907,
#14 достаточно -- осталось понять логику |
Sav2907,
попытайтесь ещё раз обьяснить, что такое смена позиции, я пока в тупике. |
Цитата:
Твой вариант, но правильнее и без лишних символов... ;)
var array = [
{
Tool1: 257
},
{
Tool1: 257,
Tool2: 258
},
{
Tool1: 257,
Tool2: 258
},
{
Tool1: 258,
Tool2: 257
},
{
Tool1: 258
},
{
Tool1: 257
},
{
Tool1: 257,
Tool2: 35
}
];
|
Sav2907,
шифровка из центра ...
var arr = [[257,],[257,258],[257,258],[258,257],[258,],[257,],[257,35],[257,35],[258,257],[258,257],[257,248],[248,257],[247,257]];
function fn(arr) {
return arr.reduce(function(a, b, i, c) {
var n = c[i - 1];
return a += +(!i || b[1] !== void 0 && (!n.includes(b[0]) || !n.includes(b[1])))
}, 0)
};
alert(fn(arr));
includes |
Спасибо, мое решение на PHP:
foreach ($data as $employeeid => $rows) {
sort($rows);
for ($i = 0; $i < count($rows); $i++) {
$tool1Found = $tool2Found = false;
if ($i > 0) {
$previousSetup = $rows[$i - 1];
$previousSetup2 = $rows[$i - 2];
$tool1Found = in_array($rows[$i]['Tool1Identifier'], $previousSetup) || in_array($rows[$i]['Tool1Identifier'], $previousSetup2);
$tool2Found = in_array($rows[$i]['Tool2Identifier'], $previousSetup) || in_array($rows[$i]['Tool2Identifier'], $previousSetup1);
}
echo sprintf('<br />%s <span style="color: %s;">%s</span> <span style="color: %s;">%s</span>', ($i + 1), ($tool1Found ? 'green' : 'red'), $rows[$i]['Tool1Identifier'], ($tool2Found ? 'green' : 'red'), $rows[$i]['Tool2Identifier']);
}
}
|
рони,
Ваш код не работает с массивом var arr = [[265,205],[265,205],[265,205],[205,205],[265,203],[265,203],[265,203],[203,45]]; Результат 6, а у вас 3. 265 205 205 265 203 45 |
Sav2907,
почему 6 а не 4? |
Sav2907,
0,205,265,true 1,205,265,false 2,205,265,false 3,205,205,true 4,203,265,true 5,203,265,false 6,203,265,false 7,45,203,true |
Цитата:
|
рони,
205 265 205 203 265 45 |
laimas,
верно, поэтому новый код
echo '
<table><tr><td>Заказ</td><td>Апликатор 1</td><td>Апликатор 2</td></tr>
';
foreach ($data as $employeeid => $rows) {
sort($rows);
for ($i = 0; $i < count($rows); $i++) {
$tool1Found = $tool2Found = false;
if ($i > 0) {
for ($j = $i - 1; $j >= 0; $j--) {
$previousSetup = $rows[$j];
$tool1Found = $tool1Found || in_array($rows[$i]['Tool1Identifier'], $previousSetup);
$tool2Found = $tool2Found || in_array($rows[$i]['Tool2Identifier'], $previousSetup);
if ($previousSetup['Tool1Identifier'] !== '' && $previousSetup['Tool2Identifier'] !== '') break;
}
}
echo sprintf('<tr><td>%s</td><td><span style="color: %s;">%s</span></td><td><span style="color: %s;">%s</span></td></tr>', ($i + 1), ($tool1Found ? 'green' : 'red'), $rows[$i]['Tool1Identifier'], ($tool2Found ? 'green' : 'red'), $rows[$i]['Tool2Identifier']);
}
}
echo '</table>';
|
Результат на более тяжелом примере
![]() |
А чем это по сути отличается от предыдущего?
sort($rows); - это ведь пустое и никчемное действие, если судить по структуре массива представленного ранее. Я так и не понял закономерности этой кухни, но, если записи возвращаются в произвольном порядке, то вхождения каждой итерации нужно искать во всем массиве. При этом, если нечто удовлетворяющее условию в нем найдено и это считается уникальностью, то она должна исключаться из исходного массива. |
laimas,
отличается тем, что проверяется весь массив. А на счет sort($rows);, вы правы :victory: |
Я не понял закономерности того, чего ищется, но могу утверждать уверенно, что столько циклов для данной операции, это слишком. На вскидку, так тут вообще не нужны явные циклы, все вполне сделает array_reduce(), см. код рони, если его подправить, то это то чего и надо.
|
laimas,
Вот только одну проблему немогу решить, 11 заказ сможете помочь? ![]() |
Цитата:
$count = array_reduce($employeeid, function($carry, $item) use($employeeid) {
//тут ищем, но чего, я не понял, и суммируем результат в $carry
}, 0);
я убежден. А может и вообще и этого не надо. |
laimas,
Если честно, я тоже не понимаю что вам не понятно. Берется номер и проверяется использовался он ранее, проверка в Tool1Identifier и Tool2Identifier |
Sav2907,
если текущая ячейка отличается от предыдущей по таким то правилам, то return $carry++ иначе просто $carry если правильно сформулировать правила, то даже сами справитесь, какие они эти правила, пока только догадки |
Мне не сложно пояснить чего я не понимаю. Но начну с того, что в sql (каким sql сервером вы пользуетесь я не в курсе) существует понятие индекс. Если смотреть на вашу выборку и к примеру разрешать запись в поля Tool1Identifier и Tool2Identifier только уникальных значений, то прежде нужно ответить на вопрос "уникальности чего?", если для каждого поля, то уникальный индекс каждому полю, а если уникальность для набора двух полей, то составной индекс для этих полей.
Понимаете к чему я это? Если взять одну часть ваших пояснений, то можно предположить, что ищутся уникальные вхождения в обеих полях. Но в таком случае нужно взять значения этих полей, объединить их в один массив, удалить пустые значения, получить только уникальные значения полученного массива и подсчитать их количество. Все решение этого тогда сводится к следующему: $cnt = count(array_unique(array_diff(array_merge(array_column($employeeid, "Tool1Identifier"), array_column($employeeid, "Tool2Identifier")), [null]))); Но как понять тогда позицию 13 где отмечено 265, 203, если 265 ранее уже встречалось? Так что вы ищите уникальное единичное значение в обеих полях или это плюс уникальность наборов? |
laimas,
Представим что перед вами два стола, на одном номер 265 на втором 205 (это позиция 10). Вы забираете 265 номер и ставите еще один 205 (это позиция 11), вот это и есть замена. Одна 205 должна была быть красной |
Нет в языке программирования понятий замена, есть к примеру уникальность. Если хотите пояснить что это такое "замена" поясните ее суть и закономерность, из приведенного выше, с пометкой красным, и с пояснений ранее я не понял ничего.
Если же пояснять категориями столов, тогда нужно пояснять сперва материю задачи, а по отрывкам.... Я понимаю, что вы понимаете того чего хотите, но я нет. |
Ладно, буду пробовать разруливать сам до конца. В любом случае, спасибо за помощь
|
| Часовой пояс GMT +3, время: 19:35. |