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 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:


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