복붙노트

다른 배열을 기반으로 키를 기준으로 배열을 정렬 하시겠습니까?

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의 내부 배열 함수를 살펴 보았지만 알파벳순으로나 숫자순으로 만 정렬 할 수있는 것 같습니다.

해결법

  1. ==============================

    1.그냥 array_merge 또는 array_replace를 사용하십시오. Array_merge는 올바른 순서로 배열을 시작하고 실제 배열의 데이터를 덮어 쓰거나 키를 추가하여 작동합니다.

    그냥 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')
    

    추신 : 나는 '부실'한 질문에 답하고 있습니다. 왜냐하면 이전 답변으로 주어진 모든 루프가 잔인하다고 생각하기 때문입니다.

  2. ==============================

    2.너 거기 간다.

    너 거기 간다.

    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;
    }
    
  3. ==============================

    3.PHP> = 5.3.0의 또 다른 방법 :

    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
    )
    

    문자열과 숫자 키로 잘 작동합니다.

  4. ==============================

    4.이 솔루션은 어떻습니까?

    이 솔루션은 어떻습니까?

    $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));
    });
    
  5. ==============================

    5.

    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;
    }
    
  6. ==============================

    6.하나의 어레이를 주문합니다 :

    하나의 어레이를 주문합니다 :

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

    array_intersect를 사용하여 값을 기반으로 다른 배열을 정렬 할 수 있습니다. 문서 도구 :

    /* 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);
    

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

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

  7. ==============================

    7.배열에 배열이 있다면, Eran으로 함수를 조금 변형시켜야합니다 ...

    배열에 배열이 있다면, 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;
    }
    
  8. ==============================

    8.Darkwaltz4의 솔루션을 사용했지만 array_flip 대신 array_fill_keys를 사용하여 $ array에 키가 설정되지 않은 경우 NULL로 채 웁니다.

    Darkwaltz4의 솔루션을 사용했지만 array_flip 대신 array_fill_keys를 사용하여 $ array에 키가 설정되지 않은 경우 NULL로 채 웁니다.

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

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

    이 함수는 두 번째 매개 변수 $ 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];
    
  10. ==============================

    10.마술없이 ...

    마술없이 ...

    $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;
    }
    
  11. ==============================

    11.PHP는 다음과 같은 기능을 제공합니다 :

    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 ()는 키 => 값 관계에 영향을주지 않고 배열을 정렬합니다.

  12. ==============================

    12.암호:

    암호:

     /**
     * 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;
    }
    
  13. ==============================

    13.첫 번째 제안

    첫 번째 제안

    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 개 사용하면 배열 병합 / 뒤집기가 실제로 다른 연관 배열을 병합하고 덮어 씁니다. 내 경우에는 내가 찾던 결과가 아닙니다. settings.ini 파일을 사용하여 정렬 순서 배열을 만들었습니다. 필자가 정렬 한 데이터 배열은 연관 연관 정렬 요소로 덮어 쓸 필요가 없습니다. 따라서 배열 병합은 내 데이터 배열을 파괴합니다. 두 방법 모두 훌륭한 방법이며, 개발자 도구 상자에 보관해야합니다. 귀하의 필요에 따라 실제로 아카이브의 두 개념이 모두 필요하다는 것을 알 수 있습니다.

  14. ==============================

    14.간결성을 위해 @ Darkwaltz4의 답을 채택했으며 배열이 각 반복에 대해 서로 다른 키를 포함 할 수있는 상황에 대한 해결책을 어떻게 적용했는지 공유하고 싶습니다.

    간결성을 위해 @ 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_merge는 $ 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);
    }
    
  15. ==============================

    15.조금 늦었지만 구현 한 방법을 찾지 못했습니다.이 버전은 클로저가 필요합니다. php> = 5.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'를 정렬해야하고 예제에서 처음으로 나타날 수 있습니다.

  16. from https://stackoverflow.com/questions/348410/sort-an-array-by-keys-based-on-another-array by cc-by-sa and MIT license