2012-02-20 3 views
2

첫 번째로 YES는 여기에 100 번 묻는 중복 문제이며 많은 게시물을 읽었지만 주어진 예제는 작동하지 않습니다 100 나를 위해 % 내가 어디 잘못 가고 있는지 알아낼 수 없습니다.PHP는 다차원 배열을 정렬하고 하나의 열만 정렬 할 수 있습니다.

'distance'키를 사용하여 배열을 정렬하고 전체 배열에 대해 정렬을 "확장"하여 배열의 모든 키를 재정렬합니다. 본질적으로 스프레드 시트에서 열을 정렬하고 모든 열에서 정렬을 확장하면 얻을 수있는 것과 마찬가지입니다.

다음은 샘플 배열이다 : 나는 '거리'에 의해 배열을 정렬하기 위해 노력하고있어

$locations = array ( 
[phone] => Array ( 
    [0] => 555-123-1234 
    [1] => 555-456-4321 
    [2] => 555-789-1122 
    [3] => 555-321-1111) 
[address] => Array ( 
    [0] => 123 Main Street BigCity, NY 12345 
    [1] => 456 Maple Street Somewhere, UT 87654 
    [2] => 999 1st Ave MyTown, VA 23456 
    [3] => 321 2nd Ave MyTown, VA 23456) 
[distance] => Array ( 
    [0] => 24.56 
    [1] => 13.05 
    [2] => 23.99 
    [3] => 1.75) 
[name] => Array ( 
    [0] => First Location 
    [1] => Second Location 
    [2] => Third Location 
    [3] => Fourth Location) 
) 

, 그리고 내가는 array_multisort() 함수와에 usort() 함수를 모두 사용하여 시도했다 ... 그러나 "multisort"만이 거리를 정렬하고 거리에 따라 전체 배열을 정렬하지 않음으로써 거의 유용한 결과를 제공합니다.

내 기능 :

array_multisort($locations['distance'], SORT_NUMERIC); 

내가 다음 배열을 통과하고 키를 사용하여 값을 뱉어하기 "에 대한"루프를 실행합니다. 결과적으로 거리가 정렬되지만 위치 이름, 주소 등은 재정렬되지 않습니다.

내가 여기에 무엇을 놓치고 있습니까 ??

감사합니다.

답변

3

배열은 열로 배열되어 있지만, array_multisort()은이 배열을 사용하여 배열로 배열해야합니다.

그것은 당신이 한 경우에 당신이 얻을 것이다 구조에 있어야합니다 :

$rows = array(); 
while ($row = $result->fetch_assoc()) $rows[] = $row; 

을 ... MySQLi 결과 객체.

당신은 아주 쉽게이 구조로 기존의 배열을 포맷 할 수 있습니다 :

$locationsAsRows = array(); 
for ($i = 0; isset($locations['phone'][$i]); $i++) { 
    $locationsAsRows[$i] = array (
    'phone' => $locations['phone'][$i], 
    'address' => $locations['address'][$i], 
    'distance' => $locations['distance'][$i], 
    'name' => $locations['name'][$i] 
); 
} 
var_dump($locationsAsRows); 

을 이제 당신이 할 때

array_multisort($locations['distance'], SORT_NUMERIC, $locationsAsRows); 
var_dump($locationsAsRows); 

은 ... 당신은 데이터 정렬 된 것을 볼 수 있습니다. 정렬 할 열 데이터를 전달할뿐만 아니라 마지막 배열로 "행 서식이 지정된"전체 배열 $locationsAsRows도 전달했습니다. 이는 참조로 전달되므로 array_multisort()을 호출 한 후에 $locationsAsRows 그 자체가 정렬 된 데이터가됩니다.

이제 두 번째 우선 순위 검색 열을 제공해야합니다. distance 값 중 두 개가 동일하다고 가정 해 봅시다. ... 위대한 설명과 예를 들어

+0

감사를

array_multisort($locations['distance'], SORT_NUMERIC, $locations['address'], SORT_ASC, $locationsAsRows); 

See it working을 그것으로 주위에 플레이가 : 그래서 다음에, 우리는 address 기준으로 정렬 할 수 있으며, 우리는과 같이 할 수있다! 내가 이해하지 못했던 부분은이 기능들이 배열을 어떻게보고 있는지에 관한 부분입니다.그러나, 예제를 사용하여 모든 행을 원하는대로 정렬해야했습니다. 이유는 모르겠지만 multisort 함수에서 모든 행을 추가하면 작동합니다. 그 이유에 대한 어떤 생각? – gtr1971

+0

'array_multisort()'는 여러 가지 방법으로 사용될 수 있지만,이 옵션은 SQL 질의에서'order by' 절과 비슷합니다. 그리고 SQL에서는 항상 행을 처리합니다. 데이터 집합을 정렬하는 방법을 알고 있으므로 (열) 정렬 할 데이터 집합을 전달한 다음 전체 규칙 집합에 따라 정렬 할 수 있도록 전체 집합을 마지막 인수로 전달해야합니다. 그래서 'SELECT 전화, 주소, 거리, 이름 FROM locations ORDER BY distance' – DaveRandom

+0

이것은'전화 번호, 주소, 거리, 이름 FROM locations ORDER BY 거리, 주소, 이름, 전화 '와 동일합니다. '$ locations, SORT_CONST' 값은'$ locationsAsRows'의 전체 데이터 세트가'ORDER BY' 절의 다른 레벨과 같습니다. 그래서'$'[ 'phone'], SORT_ASC'는 아마도 두 개의 레코드가'distance','address'와'name'에 대해 똑같은 값을 가지지 않는다면 절대로 도달하지 않을 것입니다. – DaveRandom

0
array_multisort($locations['distance'],$locations['name'],$locations['address'],$locations['phone'],SORT_NUMERIC); 

아마도이 작업을 수행 할 수 있습니까?

관련 문제