Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Фильтр массива (https://javascript.ru/forum/dom-window/66715-filtr-massiva.html)

Sav2907 05.01.2017 11:06

Фильтр массива
 
Привет, есть код:
$i = 1;
		foreach ($data as $employeeid => $rows) {
		sort($rows);
			foreach ($rows as $row) {
				echo $i++.'. ';
				echo $row['Tool1Identifier'].' ';
				echo $row['Tool2Identifier'].'<br>';
			}
			
		}


Он показывает следующее:



Если в двух словах, то человек работает с двумя позициями. На одной позиции один номер или пусто. Нужно подсчитать каждую замену номера на позиции. Типа вот так:



Всего: 6

рони 05.01.2017 11:17

Цитата:

Сообщение от Sav2907
Если в двух словах, то человек работает с двумя позициями. На одной позиции один номер или пусто. Нужно подсчитать каждую замену номера на позиции. Типа вот так:

подожду переводчика ...

Sav2907 05.01.2017 11:22


laimas 05.01.2017 11:43

Откуда эти данные и как они связаны?

ksa 05.01.2017 11:58

И каким боком тут раздел "Элементы интерфейса"? :blink:

рони 05.01.2017 12:03

Sav2907,
не легче ... что это за данные (массив?) и что такое замена позиции?
Цитата:

Сообщение от laimas
как они связаны?


Sav2907 05.01.2017 12:42

рони,
Массив.
1-13 номер заказа.
1 заказ: заказ делался одним номером (257).
2 заказ: 257 и 258
3 тем и другим

Результат:
1 заказ одна замена
2 заказ одна замена
3 ни одной

laimas 05.01.2017 12:46

Sav2907,
откуда эти данные, где хранятся?

Sav2907 05.01.2017 12:50

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);
?>

laimas 05.01.2017 12:53

Я не знаю такого sql-сервера, но если в нем данные описаны по уму, имеют связи, то все что вы пытаетесь получить, получают в рамках sql-запроса.

рони 05.01.2017 13:06

Sav2907,
массив этот напишите js
var arr = [....];

Sav2907 05.01.2017 13:16

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
        )

)

рони 05.01.2017 13:21

Sav2907,
напишите массив массивом
var arr = [[257,],[257,258]... и т.д.]

Sav2907 05.01.2017 13:30

рони,
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]];

рони 05.01.2017 13:40

Цитата:

Сообщение от Sav2907
],[258,257],[258,],[257,],[257,35],[

почему это не считается сменой позиции?

Sav2907 05.01.2017 13:48

Или так правильнее:

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" ]
            }
        }
    };

рони,
Потому что эти номера уже установлены на позициях, просто не используются оба

рони 05.01.2017 13:52

Sav2907,
#14 достаточно -- осталось понять логику

рони 05.01.2017 13:54

Sav2907,
попытайтесь ещё раз обьяснить, что такое смена позиции, я пока в тупике.

ksa 05.01.2017 13:58

Цитата:

Сообщение от Sav2907 (Сообщение 439769)
Или так правильнее:

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" ]
            }
        }
    };

рони,
Потому что эти номера уже установлены на позициях, просто не используются оба

У тебя какое-то странное отношение к массивам и объектам... :blink:
Твой вариант, но правильнее и без лишних символов... ;)

var array = [
	{
		Tool1: 257
	},
	{
		Tool1: 257,
		Tool2: 258
	},
	{
		Tool1: 257,
		Tool2: 258
	},
	{
		Tool1: 258,
		Tool2: 257
	},
	{
		Tool1: 258
	},
	{
		Tool1: 257
	},
	{
		Tool1: 257,
		Tool2: 35
	}
];

рони 05.01.2017 14:31

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

Sav2907 05.01.2017 15:32

Спасибо, мое решение на 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']);
			
			}

		}

Sav2907 05.01.2017 17:22

рони,
Ваш код не работает с массивом
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

рони 05.01.2017 17:53

Sav2907,
почему 6 а не 4?

рони 05.01.2017 17:57

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

laimas 06.01.2017 06:33

Цитата:

Сообщение от Sav2907
Результат 6, а у вас 3.

Если ваши данные будут идти в ином порядке, то и ваш код, и рони покажет иной результат. Если опять перемешать массив, опять новый.

Sav2907 06.01.2017 09:22

рони,
205
265
205
203
265
45

Sav2907 06.01.2017 09:27

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>';

Sav2907 06.01.2017 09:39

Результат на более тяжелом примере

laimas 06.01.2017 09:40

А чем это по сути отличается от предыдущего?

sort($rows); - это ведь пустое и никчемное действие, если судить по структуре массива представленного ранее.

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

Sav2907 06.01.2017 09:54

laimas,
отличается тем, что проверяется весь массив. А на счет sort($rows);, вы правы :victory:

laimas 06.01.2017 09:59

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

Sav2907 06.01.2017 10:00

laimas,
Вот только одну проблему немогу решить, 11 заказ сможете помочь?

laimas 06.01.2017 10:13

Цитата:

Сообщение от Sav2907
11 заказ сможете помочь?

Нет, ибо я так и не понял чего вы ищите, что за закономерность, как эти данные связаны. А без понимания этого нет и решения. Но, то что три цикла тут не нужны, а нужно:

$count = array_reduce($employeeid, function($carry, $item) use($employeeid) {
    //тут ищем, но чего, я не понял, и суммируем результат в $carry 
}, 0);


я убежден. А может и вообще и этого не надо.

Sav2907 06.01.2017 10:27

laimas,
Если честно, я тоже не понимаю что вам не понятно. Берется номер и проверяется использовался он ранее, проверка в Tool1Identifier и Tool2Identifier

рони 06.01.2017 10:33

Sav2907,
если текущая ячейка отличается от предыдущей по таким то правилам, то return $carry++ иначе просто $carry
если правильно сформулировать правила, то даже сами справитесь, какие они эти правила, пока только догадки

laimas 06.01.2017 10:48

Мне не сложно пояснить чего я не понимаю. Но начну с того, что в 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 ранее уже встречалось? Так что вы ищите уникальное единичное значение в обеих полях или это плюс уникальность наборов?

Sav2907 06.01.2017 10:58

laimas,
Представим что перед вами два стола, на одном номер 265 на втором 205 (это позиция 10). Вы забираете 265 номер и ставите еще один 205 (это позиция 11), вот это и есть замена. Одна 205 должна была быть красной

laimas 06.01.2017 11:04

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

Sav2907 06.01.2017 11:17

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


Часовой пояс GMT +3, время: 20:30.