programing

다른 어레이를 기반으로 키를 기준으로 어레이를 정렬하시겠습니까?

randomtip 2022. 12. 1. 23:35
반응형

다른 어레이를 기반으로 키를 기준으로 어레이를 정렬하시겠습니까?

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는 지정한 어레이부터 시작하여 (적절한 순서로) 실제 어레이의 데이터로 키를 덮어쓰거나 덮어쓰는 것으로 동작합니다.

$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',
//   'dob'        => '12/08/1986',
//   'address'    => '123 fake st',
//   'dontSortMe' => 'this value doesnt need to be sorted')

PS: 저는 이 '확실한' 질문에 대답합니다.왜냐하면 이전 답변과 같은 모든 루프가 과잉이라고 생각하기 때문입니다.

여기 있습니다.

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;
}

1개의 어레이를 주문에 따라 선택:

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

다음 명령을 사용하여 값을 기준으로 다른 어레이를 정렬할 수 있습니다.

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

또는 키를 기준으로 정렬하려면 다음을 사용합니다.

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

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

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

Darkwaltz4의 솔루션을 사용했지만array_fill_keys대신array_flip로 채우다NULL키가 설정되어 있지 않은 경우$array.

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

마법이 없으면...

$array=array(28=>c,4=>b,5=>a);
$seq=array(5,4,28);    
SortByKeyList($array,$seq) result: array(5=>a,4=>b,28=>c);

function sortByKeyList($array,$seq){
    $ret=array();
    if(empty($array) || empty($seq)) return false;
    foreach($seq as $key){$ret[$key]=$dataset[$key];}
    return $ret;
}

어레이에 어레이가 있는 경우 Eran에 의해 기능을 약간 조정해야 합니다.

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

PHP에는 다음과 같은 기능이 있습니다.

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

// sort array
usort($arrayToBeSorted, function($a, $b) use ($order){
    // sort using the numeric index of the second array
    $valA = array_search($a, $order);
    $valB = array_search($b, $order);

    // move items that don't match to end
    if ($valA === false)
        return -1;
    if ($valB === false)
        return 0;

    if ($valA > $valB)
        return 1;
    if ($valA < $valB)
        return -1;
    return 0;
});

Usort가 모든 작업을 수행하며 array_search는 키를 제공합니다.array_search()는 일치하는 항목을 찾을 수 없을 때 false를 반환하므로 정렬 배열에 없는 항목은 자동으로 배열 맨 아래로 이동합니다.

주의: uasort()는 키 => 값 관계에 영향을 주지 않고 어레이를 정렬합니다.

  • 요구대로 분류하다
  • int-keys 저장(array_replace를 위해)
  • 반환 안 함 키가 inputArray에 없습니다.
  • (임의) 지정된 keyList에 존재하지 않는 필터 키

코드:

 /**
 * sort keys like in key list
 * filter: remove keys are not listed in keyList
 * ['c'=>'red', 'd'=>'2016-12-29'] = sortAndFilterKeys(['d'=>'2016-12-29', 'c'=>'red', 'a'=>3 ]], ['c', 'd', 'z']){
 *
 * @param array $inputArray
 * @param string[]|int[] $keyList
 * @param bool $removeUnknownKeys
 * @return array
 */
static public function sortAndFilterKeys($inputArray, $keyList, $removeUnknownKeys=true){
    $keysAsKeys = array_flip($keyList);
    $result = array_replace($keysAsKeys, $inputArray); // result = sorted keys + values from input + 
    $result = array_intersect_key($result, $inputArray); // remove keys are not existing in inputArray 
    if( $removeUnknownKeys ){
        $result = array_intersect_key($result, $keysAsKeys); // remove keys are not existing in keyList 
    }
    return $result;
}

이 함수는 두 번째 매개 변수 $keys를 기준으로 정렬된 하위 배열을 반환합니다.

function array_sub_sort(array $values, array $keys){
    $keys = array_flip($keys);
    return array_merge(array_intersect_key($keys, $values), array_intersect_key($values, $keys));
}

예:

$array_complete = [
    'a' => 1,
    'c' => 3,
    'd' => 4,
    'e' => 5,
    'b' => 2
];

$array_sub_sorted = array_sub_sort($array_complete, ['a', 'b', 'c']);//return ['a' => 1, 'b' => 2, 'c' => 3];

조금 늦었지만, 실장 방법을 찾을 수 없었습니다.이 버전은 닫아야 합니다.php > = 5.3. 단, 다음과 같이 변경할 수 없습니다.

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

$order = array('name', 'dob', 'address');

$keys= array_flip($order);
uksort($customer, function($a, $b)use($keys){
    return $keys[$a] - $keys[$b];
});
print_r($customer);

물론 'dontSortMe'를 분류해야 합니다.이 예에서는 처음에 표시될 수 있습니다.

첫 번째 제안

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

두 번째 제안

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

이 두 가지 제안 모두 훌륭하다는 것을 지적하고 싶습니다.하지만 그것들은 사과와 오렌지입니다.차이점?하나는 비연상 친화적이고 다른 하나는 연상 친화적이다.2개의 완전히 연관된 어레이를 사용하는 경우 어레이의 Marge/Flip이 실제로 Marge되어 다른 어레이를 덮어씁니다.내 경우 그것은 내가 찾던 결과가 아니다.settings.ini 파일을 사용하여 정렬 순서 배열을 만들었습니다.정렬하고 있던 데이터 배열은 관련 정렬 담당자가 덮어쓸 필요가 없었습니다.따라서 배열 병합으로 인해 데이터 배열이 파괴됩니다.둘 다 훌륭한 방법이며, 둘 다 개발자 도구 상자에 보관해야 합니다.고객의 요구에 따라 아카이브에 두 가지 개념이 실제로 필요할 수 있습니다.

간단하게 @Darkwaltz4의 답변을 채택하여 어레이에 다음과 같이 반복마다 다른 키가 포함될 수 있는 상황에서 솔루션을 어떻게 적응시켰는지 알려드리고 싶습니다.

Array[0] ...
['dob'] = '12/08/1986';
['some_key'] = 'some value';

Array[1] ...
['dob'] = '12/08/1986';

Array[2] ...
['dob'] = '12/08/1986';
['some_key'] = 'some other value';

다음과 같은 '마스터 키'를 유지했습니다.

$master_key = array( 'dob' => ' ' ,  'some_key' => ' ' );

array_marge는 $master_key를 기반으로 Array[1] 반복에서 병합을 실행하고 해당 반복에 대해 빈 값인 ['some_key'] = '을 생성했을 것입니다.따라서 array_intersect_key는 다음과 같이 각 반복에서 $master_key를 수정하기 위해 사용되었습니다.

foreach ($customer as $customer) {
  $modified_key = array_intersect_key($master_key, $unordered_array);
  $properOrderedArray = array_merge($modified_key, $customer);
}

이와 같은 어레이가 있고 어레이를 순서에 따라 정렬해야 하는 경우 다음 코드를 쉽게 사용할 수 있습니다.

$order = ['a', 'b', 'c', 'd', 'e'];
$needToSortArray = ['d', 'c', 'e'];

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

언급URL : https://stackoverflow.com/questions/348410/sort-an-array-by-keys-based-on-another-array

반응형