[php] 다른 배열을 기반으로 키로 배열을 정렬 하시겠습니까?

PHP에서 이와 같은 작업을 수행 할 수 있습니까? 함수 작성은 어떻게 하시겠습니까? 다음은 예입니다. 순서가 가장 중요합니다.

$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';

그리고 저는 다음과 같은 일을하고 싶습니다

$properOrderedArray = sortArrayByArray($customer, array('name', 'dob', 'address'));

결국 foreach ()를 사용하고 올바른 순서가 아니기 때문에 (정확한 순서가 필요한 문자열에 값을 추가하고 모든 배열 키를 미리 알지 못하기 때문에) 값).

PHP의 내부 배열 함수를 살펴 보았지만 알파벳순 또는 숫자 순으로 만 정렬 할 수 있습니다.



답변

array_merge또는을 사용하십시오 array_replace. Array_merge주어진 배열로 시작하여 (적절한 순서로) 실제 배열의 데이터로 키를 덮어 쓰거나 추가하여 작동합니다.

$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';

$properOrderedArray = array_merge(array_flip(array('name', 'dob', 'address')), $customer);
//Or:
$properOrderedArray = array_replace(array_flip(array('name', 'dob', 'address')), $customer);

//$properOrderedArray -> array('name' => 'Tim', 'address' => '123 fake st', 'dob' => '12/08/1986', 'dontSortMe' => 'this value doesnt need to be sorted')

추신-나는이 ‘이야기’질문에 대답하고 있습니다. 왜냐하면 이전 답변으로 주어진 모든 루프가 과잉이라고 생각하기 때문입니다.


답변

당신은 간다 :

function sortArrayByArray(array $array, array $orderArray) {
    $ordered = array();
    foreach ($orderArray as $key) {
        if (array_key_exists($key, $array)) {
            $ordered[$key] = $array[$key];
            unset($array[$key]);
        }
    }
    return $ordered + $array;
}


답변

이 솔루션은 어떻습니까

$order = array(1,5,2,4,3,6);

$array = array(
    1 => 'one',
    2 => 'two',
    3 => 'three',
    4 => 'four',
    5 => 'five',
    6 => 'six'
);

uksort($array, function($key1, $key2) use ($order) {
    return (array_search($key1, $order) > array_search($key2, $order));
});


답변

PHP> = 5.3.0의 다른 방법 :

$customer['address'] = '123 fake st';
$customer['name'] = 'Tim';
$customer['dob'] = '12/08/1986';
$customer['dontSortMe'] = 'this value doesnt need to be sorted';

$customerSorted = array_replace(array_flip(array('name', 'dob', 'address')), $customer);

결과:

Array (
  [name] => Tim
  [dob] => 12/08/1986
  [address] => 123 fake st
  [dontSortMe] => this value doesnt need to be sorted
)

문자열 및 숫자 키와 잘 작동합니다.


답변

function sortArrayByArray(array $toSort, array $sortByValuesAsKeys)
{
    $commonKeysInOrder = array_intersect_key(array_flip($sortByValuesAsKeys), $toSort);
    $commonKeysWithValue = array_intersect_key($toSort, $commonKeysInOrder);
    $sorted = array_merge($commonKeysInOrder, $commonKeysWithValue);
    return $sorted;
}


답변

하나의 배열을 주문으로 취하십시오.

$order = array('north', 'east', 'south', 'west');

array_intersectDocs를 사용하여 값을 기반으로 다른 배열을 정렬 할 수 있습니다 .

/* sort by value: */
$array = array('south', 'west', 'north');
$sorted = array_intersect($order, $array);
print_r($sorted);

또는 귀하의 경우 키별로 정렬하려면 array_intersect_keyDocs를 사용하십시오 .

/* sort by key: */
$array = array_flip($array);
$sorted = array_intersect_key(array_flip($order), $array);
print_r($sorted);

두 함수 모두 첫 번째 매개 변수의 순서를 유지하고 두 번째 배열의 값 (또는 키) 만 반환합니다.

따라서이 두 표준 사례의 경우 정렬 / 재정렬을 수행하기 위해 직접 함수를 작성할 필요가 없습니다.


답변

Darkwaltz4의 솔루션을 사용했지만 키가 설정되어 있지 않은 경우 채우기 위해 array_fill_keys대신 사용 했습니다 .array_flipNULL$array

$properOrderedArray = array_replace(array_fill_keys($keys, null), $array);