개발 Q&A

제목 반복문을 통해 값이 일치하는 부분에만 데이터를 보여주고 싶은데 어떻게 해야될까요
글쓴이 정수리 작성시각 2016/10/17 17:07:46
댓글 : 6 추천 : 0 스크랩 : 0 조회수 : 11984   RSS

DB에서 데이터를 가져와 배열에 저장하였습니다. 

$list 배열(프로그램 이름, 프로그램 고유키) 

$info배열(프로그램 고유키, 프로그램 금액)->프로그램별 가격과 고유키의 경우 유동적으로갯수가 다를수 있습니다. 

ex(1,100000), (2, 200000), (5,10000) 

이렇게 두개의 정보를 가진 배열이 있습니다. 

하나의 유지보수 계약건을 선택하고 수정 버튼을 클릭하면 

A기관에 맺어진 프로그램들이 리스트가 출력이 됩니다. 

여기까지는 구현을 하였습니다. 

문제는 유지보수계약을 했을 때 프로그램 중 유지보수 계약을 맺을 프로그램을 선택하고 금액을 적은 뒤 등록을 합니다. 

그리고 수정버튼을 누르면 유지보수 계약시 맺었던 프로그램들이 선택이 되어있고 금액이 적혀여 있는상태를 구현 

하고자 합니다 

수정페이지에서 프로그램리스트의 경우 DB에 저장되어있는 모든 프로그램들을 가져와 리스트를 출력하는 것이 아닌 

처음에 말했던 A기관에 맺어 프로그램들만 출력이 되며 그중에서도 유지보수계약 시 선택했던 프로그램들만 체크박스에 체크가 되어있어야 하며 금액도 출력이 되어있어야 하는 상태의 수정페이지를 만들고자 합니다. 

phpshcool에 통해 참조하여 해결하였다고 생각했지만;; 

리스트에서 

1 A프로그램 

2 B프로그램 

3 C프로그램 

4 D프로그램 

5 E프로그램 

이렇게 출력이 되고 

유지보수 계약 시 맺었던 프로그램은 A,B,E프로그램입니다.  그렇다면 수정시 

X:체크박스 

1 A프로그램 X  1,000,000 

2 B프로그램 X  1,000,000 

3 C프로그램 

4 D프로그램 

5 E프로그램 X    1,000,000 

이렇게 출력이 되어야 하는데 

밑의 코드의 경우는 

1(고유키값) A프로그램 X  1,000,000 

2 B프로그램 X  1,000,000 

3 C프로그램 

4 D프로그램 

5 E프로그램 

이렇게 A,B만 출력이 됩니다. 

제가 찾아낸 원인의 경우 

프로그램의 고유키값과 금액을 DB에서 가져와 var_dump 통해 $info 배열을 출력해보면 

[0]=> pk :1, [1]=>pk:2, [2]=>[5] 

이렇게 가져오는데 소스의 경우 foreach문을 통해 0~4까지 pk값을 비교하여 데이터를 출력하는데 루프가  2일때 프로그램의 고유키값은 3인데 $info배열의 2인덱스의 경우 값이 5이기에 서로 값이 틀려 출력이 안되며 

루프4번에 E프로그램의 pk과 비교를 하고자했을때는 $info배열에 4라는 인덱스가 없어서 에러가 출력이 됩니다 ㅜㅜ 

그렇기에 일단은 @통해 에러가 출력되는 것은 막았습니다만 제가 원하는 기능이 미완성이 였습니다. 

어떻게 코드를 변경하여야 제가 원하는 기능을 만들수 있을까요?

 

<?php
$i=0;
foreach($list as $pg){
	
	$name =$pg->pg_name;
$number = $pg->pg_pk;
	if($pg->pg_pk == @$info[$i]->pg_pk){
		
?>	
	<tr>
		<td><input type = "checkbox" name ="pg_pk[]" value = "<?= $number ?>" checked="checked"/> <?= $name ?></td>		
		<td><input type="text" name="uj_pg_pr[]" value="<?=$info[$pg->pg_pk]->uj_pg_pr?>" onchange="getNumber(this);" onkeyup="getNumber(this);" style="text-align:right;"/></td>
	</tr>
				
<?php
	}else{
	
?>
		<tr>
			<td><input type = "checkbox" name ="pg_pk[]" value = "<?= $number ?>" /> <?= $name ?></td>		
			<td><input type="text" name="uj_pg_pr[]" onchange="getNumber(this);" onkeyup="getNumber(this);" style="text-align:right;"/></td>
		</tr>
<?php
	}
?>
	
<?php
$i++;
}
?>

 

 다음글 alert -> history.back 이후 양식... (1)
 이전글 IDE tool 질문드립니다. (3)

댓글

kaido / 2016/10/17 20:07:50 / 추천 0

이번 질문의 대답은 참 고민스럽습니다.

어떻게 대답을 해드려야 할지....

 

일단 이 문제가 루프문을 다루는 알고리즘 문제 이란것은 알고 계실것 입니다.

알고리즘을 잘 할 필요는 없지만, 해당 하는 문제는 혼자 푸실 정도는 되셔야 합니다.

전 가능 하면 이 문제를 혼자 고민 하면서 푸셨으면 합니다.

아무리 복잡해 보이는 알고리즘도 하나씩 풀면 풀립니다. 

 

정수리님은 학생이 아닙니다. 돈 받고 일하고 있는 프로 입니다.

 

한대승(불의회상) / 2016/10/17 21:44:20 / 추천 0
foreach를 써보세요.
정수리 / 2016/10/18 10:13:01 / 추천 0

@kaido

나름 혼자고민하면서 하고 있습니다.

현재까지 거이 원하는 형태로 만들어지고 있습니다.

 

정수리 / 2016/10/18 10:16:32 / 추천 0

@한대승

foreach문으로는 도저히 안될것 같아 현재는 이중 for문을 통해 

거이 원하는 형태로 나왔는데

문제는 똑같은 부분이 2개씩 출력이 됩니다;

function arr_convert($a){

		return $a;
}
//$test1=get_object_vars($info[0]);
$test2= array_map('arr_convert', get_object_vars($info[0]));


//var_dump($test2['pg_pk']);
//var_dump($info[1]);
for($i=0; $i<count($list); $i++){
	$name=$list[$i]->pg_name;
	$number=$list[$i]->pg_pk;
	for($j=0; $j<count($info); $j++){
		$test =array_map('arr_convert', get_object_vars($info[$j]));
		unset($test['uj_kinds']);
		if(in_array($list[$i]->pg_pk, $test)){
			
			echo 'true: '.$list[$i]->pg_pk.'<br>';
			var_dump($test);
?>		
	<tr>
		<td><input type = "checkbox" name ="pg_pk[]" value = "<?=$number?>" checked="checked"/><?=$name?></td>
		<td><input type="text" name="uj_pg_pr[]" value="<?=$info[$j]->uj_pg_pr?>" onchange="getNumber(this);" onkeyup="getNumber(this);" style="text-align:right;"/></td>
	</tr>
				
<?php
	}else{
	
	echo 'false: '.$list[$i]->pg_pk.'<br>';
?>
		<tr>
			<td><input type = "checkbox" name ="pg_pk[]" value = "<?=$number?>" /><?=$name?></td>		
			<td><input type="text" name="uj_pg_pr[]" onchange="getNumber(this);" onkeyup="getNumber(this);" style="text-align:right;"/></td>
		</tr>
<?php
		}
	}
}

?>

 

 

 

박준영 / 2016/10/18 12:30:25 / 추천 0
스압이 느껴져서 잘 못봤는데 array_key_exists  나 array search 류의 함수를 쓰는게 어떨까합니다.
우찬아빠 / 2016/10/18 12:51:29 / 추천 0
배열을 두개로 하는 방법말고 DB에서 불러올 때  프로그램 이름, 프로그램 고유키, 프로그램 금액, 유지보수 계약 유무 등의 정보를 한번에 불러와서 처리하는 방법을 고려해 보시면 어떨까 합니다.