2013-02-03 2 views
0

정렬 된 객체 배열을 유지 관리 할 수있는 방법이 있습니까? 내가 속성 ID, 날짜, 이름과이 개체의 컬렉션을 가진 객체가있는 경우정렬 된 객체 배열

예를 들어, : 내가있는 getObjects 뭔가를 호출하는 경우

$col = array(); 

public function addNewObject($id, $date, $name) 
{ 
    $col[] = new Object($id, $date, $name); 
    //but instead of appending, it should place it by Name desc 
} 

, 그것은 이름하여 컬렉션의 항목을 반환 desc.

개체를 정렬 된 순서로 다시 가져 오는 방법에 대한 해답이 있다고 생각합니다. 효율성을 위해 필자의 경우 "정렬 기준"변수로 삽입 할 때 정렬하는 것이 더 좋을 것이라고 생각합니다.

UPDATE : 배열은 항상에 정렬 된 순서에있을 것 때문에 ...

을 그래서 의견에 따라 , 나는 때마다 뭔가가 추가되어 전체 배열을 의지해야하지만 집중적 인 비트 메모리를 보인다 배열을 횡단하여 삽입하려는 위치를 식별 할 수 있습니다 (이 방법이 더 효율적일까요? 더 좋은 방법이 있습니까?). 일단 내가 어떻게 배열에 새로운 객체를 "삽입"할 수 있는지 알게되면?

배열이 매우 커도 상상할 수는 없지만 가능한 가장 효율적인 방법을 구현하고 싶습니다.

+0

이전 배열을 유지하고 복제본을 재정렬하기 위해 배열 객체를 복제 할 수 있습니다. – thegrunt

+1

이러한 순서를 유지하는 방법은 새 항목을 추가 한 후 전체 배열을 사용하는 것입니다. –

+0

@thegrunt의 답을 바탕으로 요소를 추가 한 후 배열을 정렬하면 필요할 때 정렬됩니다. 같은 방식으로 항상 정렬되기를 원하기 때문에 배열에 대한 다중 액세스로 인해 여러 정렬이 발생하지는 않습니다. 올바른 위치에 삽입하려면 어쨌든 새로운 요소가있는 곳을 파악하는 '정렬'이 필요합니다. 어레이의 크기에 따라 추가 작업을 할 가치가 없을 수도 있습니다. – Floris

답변

1

배열을 추가 한 후에 (비록 내가 그것을 권하고 싶습니다; 현실적으로 이것은 성능 문제가 아니며 코드를 읽을 수있게 해줍니다.

그러나 당신은 확실히 다음이 작업을 수행하지 않으려면 당신이 말한대로, 배열을 통과 할 수 삽입 할 곳을 찾을 :

$col = array(); 

public function addNewObject($id, $date, $name){ 
    //Find the index to insert at 
    $index = 0; 
    foreach($col as $i => $item){ 
     if($item->name > $name){ 
      //This item is after the item we want to insert. 
      //Use the previous index and stop traversing 
      break; 
     } 
     $index = $i; 
    } 
    $col = array_splice($col, $index, 0, new Object($id, $date, $name)); 
} 

을 임의적 인 위치 덕분에 삽입 array_splice을 사용하여 ~ https://stackoverflow.com/a/3797526/505722

+0

감사합니다. 나는 그것을 먼저 시도 할 것이다. – allanx2000

0

이 당신이 당신의 예에서

http://www.php.net/manual/en/function.sort.php#99419

으로 분류되어 원하는 키에서 배열을 정렬하는 기능의 좋은 예입니다 당신이 좋아하는 실행해야합니다

array_sort($col, 'Name', SORT_DESC)); 

걸릴 배열에 새 항목을 추가 할 때마다 전체 배열이 매번 정렬됩니다.