2010-01-05 3 views
3

빠른 질문입니다. PHP/MySQL에 대한 가장 기초 지식이없는 사람에게는 매우 쉬운 해결책이 있다고 생각합니다.기본 PHP MySQL 배열 그룹핑 질문

도시, 주 및 다른 변수가있는 데이터베이스에 다양한 상태의 도시 목록이 있습니다. 지금 그들은 도시 이름으로 분류 목록으로 뽑아 얻을 :

  • 앵커리지, AK
  • 볼티모어, MD
  • 시카고, 일리노이 등 등

나는 할 수 있도록하려면 상태별로 그룹화 한 다음 해당 상태 값이있는 모든 도시를 나열하십시오. 그래서 보이는 것 같은 :

AK

  • 앵커리지
  • 주노

CA

  • 로스 앤젤레스
  • 샌디에고
  • 샌프란시스코
  • 등 등

내가 foreach는 어떤 종류의 작업을 수행해야하고 온라인 검색 것을 알고,하지만 난 일을 얻을 수있는 예제를 발견하지 않았습니다.

은 여기 내가 기본 목록을 끌어 무엇을 :

$list = mysql_query("SELECT id, alphaname, state FROM regional ORDER BY alphaname",$db); 

while ($thearray = mysql_fetch_array($list)) { 
    echo "<li><a href='info.html?id=$thearray[id]'>$thearray[alphaname], $thearray[state]</a></li>"; 
    } 

나는 그것이 고통과 완전히 바보가 될 것입니다 각 상태에 대한 쿼리를 실행하는 것입니다 수행하는 방법을 알고있는 유일한 방법은 .. .

어떤 도움을 주셔서 감사합니다!

업데이트 해결되었습니다. i-g도 잘 작동했지만 rockacola의 접근 방식을 사용했습니다.

답변

3

이 시도 ..

쿼리 상태의 모든 도시, 주에 의해 순서를 먼저시에서 :

SELECT id, alphaname, state 
FROM regional 
ORDER BY state ASC, alphaname ASC 

2 차원 배열로 데이터 집합을 구성 :

이제
$states = array(); 
while($thearray = mysql_fetch_array($list)) 
{ 
    $states[$thearray[state]][$thearray[id]] = $thearray[alphaname]; 
} 

내용을 의 내용은 다음과 같아야합니다.

Array 
(
    [AK] => Array (
     [id_1] = Anchorage 
     [id_2] = Juneau 
    ) 
    [CA] => Array (
     [id_3] = Los Angeles 
     [id_4] = San Diego 
     [id_5] = San Francisco 
    ) 
) 

HTML 프레젠테이션 생성 :

참고 : 제안 된 질문을 반영하기 위해 앵커를 추가하십시오.

foreach($states as $state_name => $cities) 
{ 
    echo '<h3>'.$state_name.'</h3>'; 
    echo '<ul>'; 
    foreach($cities as $id => $city_name) 
    { 
     echo '<li><a href="info.html?id='.$id.'">'.$city_name.'</a></li>'; 
    } 
    echo '</ul>'; 
} 
+0

데이터 검색 및 munging에서 프레젠테이션을 분리하기 때문에이 접근법이 ig 's보다 맘에 들지만 선택 문이 데이터 검색 및 munging에 대한 질문 만하기 때문에 $ tharray [id]에 아무 것도 넣지 않을 것이라고 생각하지 않습니다. 이름과 주. 여전히 사용할 수 있습니다. $ states [$ thearray [state]] [] = $ thearray [alphaname]; ID를 그대로 두십시오. (출력 측면에서 i-g이 수행 한 것처럼 목록을 사용하는 경우를 만들 수 있습니다.) – sprugman

+0

@sprugman, 고마워요. ID 사용법은 @ Voodoo의 요구 사항의 일부이므로 쿼리에서 SELECT id를 선택해야합니다. 예,'$ states [$ thearray [state]] []'는 ID를 빼내기 위해 노력할 것입니다. –

+0

@sprugmanI는 ID를 변수로 사용하여 링크를 작성 했으므로이를 포함 시켰습니다. – Voodoo

0

상태별로 모든 행을 정렬하십시오. 그런 다음 모든 행을 순서대로 탐색하십시오. 첫 번째 행과 이전 행과 다른 상태의 모든 행에서 도시 이름을 출력하기 전에 상태 이름을 출력하십시오.

-2

SQL은 2 차원 데이터 이상을 반환하지 않습니다. 당신이 원하는 것은 어떤 종류의 피벗 컬럼을 얻는 것입니다. 문제에 대한 대답은 모든 행을 가져올 수 있습니다 :

SELECT * FROM regional ORDER BY state; 

그런 다음 정렬하고 PHP (또는 선택의 언어),하지만 SQL을 사용하여 그룹.

+0

데이터를 피벗하는 것과 관련이없고, '주문'은 OP가 제공 한 것과 동일합니다. –

1

업데이트하여 SQL 쿼리를 사용 : 예의 목적을 위해 SELECT state, alphaname AS city를 사용하는 가정 ...

state city 
------------------ 
AK  Anchorage 
AK  Juneau 

:

ORDER BY state, alphaname 

이 같은 데이터베이스 반환 결과를 만들 것입니다.

//Please excuse my hideous attempt at PHP. Better to think of it as Psuedo code 
while ($thearray = mysql_fetch_array($list)) { 
    echo $thearray[state] 
    echo "<li><a href='info.html?id=$thearray[id]'>$thearray[alphaname]</a></li>"; 
} 

을 ... 또는 당신은 i-g의 포스트에서 볼 수 있습니다 :

발표는 PHP에서 처리 할 수있다.

+0

네,이 접근 방식을 권장합니다. –