অন্য অ্যারের উপর ভিত্তি করে কী দ্বারা অ্যারে বাছাই করুন?


153

পিএইচপি তে কি এমন কিছু করা সম্ভব? আপনি কিভাবে একটি ফাংশন লিখতে যেতে হবে? এখানে একটি উদাহরণ। অর্ডার সবচেয়ে গুরুত্বপূর্ণ জিনিস।

$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'));

কারণ শেষে আমি একটি অগ্রণী () ব্যবহার করি এবং সেগুলি সঠিক ক্রমে থাকে না (কারণ আমি মানগুলিকে একটি স্ট্রিংয়ে সংযোজন করি যা সঠিক ক্রমে হওয়া দরকার এবং আমি অ্যারে কীগুলি / সমস্ত আগে থেকেই জানি না / মান)।

আমি পিএইচপি এর অভ্যন্তরীণ অ্যারে ফাংশনগুলি দেখেছি তবে মনে হয় আপনি কেবল বর্ণানুক্রমিক বা সংখ্যাগতভাবে বাছাই করতে পারেন।

উত্তর:


347

শুধু ব্যবহার array_mergeবা array_replaceArray_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')

পিএস - আমি এই 'বাসি' প্রশ্নের উত্তর দিচ্ছি, কারণ আমি মনে করি পূর্ববর্তী উত্তর হিসাবে প্রদত্ত সমস্ত লুপগুলি ওভারকিল করেছে।


31
এটি যদি আপনার স্ট্রিং কী থাকে তবে সংখ্যার জন্য না হলে এটি দুর্দান্তভাবে কাজ করে। পিএইচপি ডক্স: "যদি ইনপুট অ্যারেগুলিতে একই স্ট্রিং কী থাকে তবে সেই কীটির জন্য পরবর্তী মানটি পূর্ববর্তীটি ওভাররাইট করে। যোগ করা। "
বলবোল

7
দুর্দান্ত, তবে কীগুলি যদি মানগুলিতে না থাকে? আমার এটি দরকার, তবে কেবল কীগুলির কোনও উপস্থিতি থাকলে ... সম্ভবত এটির জন্য অবশ্যই ভবিষ্যদ্বাণী প্রয়োজন ...
সলোমন ক্লসন

5
আমার ক্ষেত্রে এটি অ্যারে_জলের পরিবর্তে অ্যারে_প্লেস। অ্যারে_মিটার উভয় মান একত্রিত করার পরিবর্তে আদেশকৃত কীগুলিতে দ্বিতীয় অ্যারে প্রতিস্থাপন করে।
neofreko

3
কয়েক বছর আগে আমি আপনার সমাধানটি পেরিয়ে গিয়েছিলাম অন্যরকম কিছু অনুসন্ধান করার জন্য - এবং আমি নিজেকে ভেবেছিলাম, লুপগুলির তুলনায় এটি অত্যন্ত দক্ষ। এখন আপনার সমাধানের দরকার আছে এবং এটি আবার খুঁজে পেতে আমার এক ঘন্টা সময় লাগল! ধন্যবাদ!
মাইকেল

4
অতিরিক্তভাবে, যদি 'অর্ডার' অ্যারে (যেমন, অ্যারে ('নাম', 'দোব', 'ঠিকানা')) বাছাই করার জন্য অ্যারের চেয়ে আরও কী থাকে তবে মূল অ্যারের সাথে ফলাফলের অনুসারে বাছাই করা অ্যারের অতিরিক্ত অ্যারে_আইন্টারেক্ট কেটে যাবে অ্যারে_মার্জে যুক্ত হওয়া স্ট্রে কীগুলি।
bbe

105

এই নাও:

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

12
সুতরাং আপনি + চিহ্ন সহ ২ টি অ্যারে যোগদান করতে পারেন? আমি কখনই জানতাম না, আমি ব্যবহার করছি array_merge()!
অ্যালেক্স

3
এটি ব্যবহার করার চেয়ে usort()বা ভাল uasort()?
গ্র্যান্টপার্পস

5
breakমানটি পাওয়া গেলে আপনার একটি বিবৃতি প্রবেশ করা উচিত ।
অ্যাডেল

4
@ অ্যালেক্স আপনি array_merge()অ্যারে +অপারেটরের সাথে প্রতিস্থাপন করার সময় খুব সাবধান হন । এটা তোলে কী (এছাড়াও সাংখ্যিক কী জন্য) এবং থেকে দ্বারা সংযোজন ডানে বামে , যখন array_mergeথেকে মার্জ ডান হতে বামে এবং কখনও সাংখ্যিক কী মুছে ফেলা হয়। যেমন [0,1,2]+[0,5,6,7] = [0,1,2,7]যখন array_merge([0,1,2],[0,5,6,7]) = [0,1,2,0,5,6,7]এবং ['a' => 5] + ['a' => 7] = ['a' => 5]কিন্তু array_merge(['a' => 5], ['a' => 7]) = ['a' => 7]
ফ্লু

+সাইন ব্যবহার করা কি নিরাপদ ?
crmpicco

47

কিভাবে এই সমাধান সম্পর্কে

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

1
এটির জন্য আরও উচ্চতর প্রয়োজন, অন্যটি কাজ করে না / ভাল কাজ করে না যখন এটি আমার ক্ষেত্রে ঠিক আছে।
এনজি সেক লং

এটি খুব দক্ষ নয়। প্রতিটি তুলনার জন্য, অ্যারেতে দুটি লিনিয়ার অনুসন্ধান করা হয়। যদি আমরা ইউকোর্ট () এর সময়ের জটিলতা অনুমান করি O(n * log n), তবে এই অ্যালগরিদমটি চলে O(n^2 * log(n))
থিওপরেটর

36

পিএইচপি> = 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
)

স্ট্রিং এবং সংখ্যা কীগুলির সাথে সূক্ষ্মভাবে কাজ করে Works


2
+ তারা উভয়ই কাজ করার সময়, আমি এর array_replace()চেয়ে আরও ভাল রিলে খুঁজে পেয়েছি array_merge()
জেসন ম্যাকক্রারি

1
array_replaceপরিবর্তনশীল প্রকারটি অক্ষত রাখে। আপনার অ্যারের মধ্যে মান এক হত তাহলে (string) '1'এবং আপনার ব্যবহার করেছেন চাই +অপারেটর, মান পরিণত করা হত(int) 1
halfpastfour.am

1
এটি সংখ্যার কীগুলিতেও কাজ করে ( array_merge()কেবল এগুলি সংযোজন করতে পারে?) যুক্তিটি এখানে খুব ভালভাবে ব্যাখ্যা করা হয়েছেপ্রথম , array_flip()কী থেকে $ অর্ডার অ্যারে এর মান পরিবর্তন। দ্বিতীয়ত , array_replace()প্রথম অ্যারের মানগুলি দ্বিতীয় অ্যারে একই কীগুলির মানগুলির সাথে প্রতিস্থাপন করে। যদি আপনাকে অন্যের কী অনুসারে একটি অ্যারে বাছাই করতে হয় তবে আপনাকে ব্যবহার করতে হবে না array_flip
এক্সেল

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

14

আপনার অর্ডার হিসাবে একটি অ্যারে নিন:

$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_keyডক্স ব্যবহার করুন :

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

উভয় ফাংশন প্রথম প্যারামিটারের ক্রম বজায় রাখবে এবং কেবল দ্বিতীয় অ্যারে থেকে মানগুলি (বা কীগুলি) ফিরিয়ে দেবে।

সুতরাং এই দুটি স্ট্যান্ডার্ড কেসের জন্য বাছাই / পুনরায় সাজানো সম্পাদনের জন্য আপনার নিজের কোনও ফাংশন লিখতে হবে না।


ছেদটি সে সমস্ত প্রবেশগুলি থেকে মুক্তি পাবে যা তিনি আগে থেকে জানেন না।
ড্যানম্যান

1
কী দ্বারা বাছাই করার জন্য এটি ভুল। অ্যারে_আইন্টারেক্ট_কি কেবল অ্যারে 1 থেকে মানগুলি ফিরিয়ে দেবে, অ্যারে 2 নয়
ভুতুড়ে

প্যাভসিডের সাথে একমত - অ্যারে_ইন্টারেক্টে_কির উদাহরণটি ভুল - এটি দ্বিতীয়টি নয়, প্রথম অ্যারে থেকে মানগুলি ফিরিয়ে দেয়।
জোনাথন অ্যাকিনো

10

আমি ডার্কওয়াল্টজ 4 এর সমাধানটি ব্যবহার করেছি তবে array_fill_keysপরিবর্তে ব্যবহৃত হয়েছিল array_flip, NULLকোনও কী কী সেট না করা থাকলে তা পূরণ করতে $array

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

5

যাদু ছাড়া ...

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

1
এটি দুর্দান্ত ধন্যবাদ ধন্যবাদ, কেবলমাত্র $datasetপ্যারামিটারের সাথে মেলে আপডেট করুন
কুর্সুস

3

আপনার অ্যারেতে যদি অ্যারে থাকে তবে আপনাকে ইরান দ্বারা ফাংশনটি কিছুটা মানিয়ে নিতে হবে ...

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

2

এই ফাংশনটি দ্বিতীয় প্যারামিটার $ কীগুলির ভিত্তিতে একটি সাব এবং সাজানো অ্যারে প্রদান করে

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

1

এটিতে আপনাকে সহায়তা করার জন্য পিএইচপি এর ফাংশন রয়েছে:

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

ইউর্ট আপনার জন্য সমস্ত কাজ করে এবং অ্যারে_সার্চ কীগুলি সরবরাহ করে। অ্যারে_সার্চ () মিথ্যা ফিরিয়ে দেয় যখন এটি কোনও মিল খুঁজে পায় না তাই আইটেমগুলি সাজান অ্যারেতে নেই এমনভাবে স্বাভাবিকভাবে অ্যারের নীচে চলে যায়।

দ্রষ্টব্য: uasort () কী => মান সম্পর্কের প্রভাব ছাড়াই অ্যারে অর্ডার করবে।


1
  • অনুরোধ অনুসারে বাছাই করুন
  • ইন-কীগুলির জন্য সংরক্ষণ করুন (অ্যারে_রেপ্লেসের কারণে)
  • কীগুলি রিটার্ন করবেন না ইনপুটআরে বিদ্যমান নেই
  • (allyচ্ছিকভাবে) ফিল্টার কীগুলি প্রদত্ত কীলিস্টে বিদ্যমান নেই

কোড:

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

1

প্রথম পরামর্শ

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

আমি উল্লেখ করতে চেয়েছিলাম যে এই দুটি পরামর্শই দুর্দান্ত। তবে এগুলি আপেল এবং কমলা। পার্থক্য? একটি হ'ল নন-অ্যাসোসিয়েটিভ বান্ধব এবং অন্যটি হলেন সহযোগী বান্ধব friendly আপনি যদি 2 টি সম্পূর্ণ এসোসিয়েটিভ অ্যারে ব্যবহার করে থাকেন তবে অ্যারে মার্জ / ফ্লিপ প্রকৃতপক্ষে মার্জ হবে এবং অন্যান্য এসোসিয়েটিভ অ্যারে ওভাররাইট করবে। আমার ক্ষেত্রে এটি ফলাফল নয় যা আমি খুঁজছিলাম is আমি আমার সাজানোর অর্ডার অ্যারে তৈরি করতে একটি सेटिंगসআইআই ফাইল ব্যবহার করেছি। আমি যে ডেটা অ্যারে বাছাই করেছিলাম তা আমার এসোসিয়েটিভ বাছাইয়ের অংশটি লিখে দেওয়ার দরকার পড়েনি। সুতরাং অ্যারের মার্জ আমার ডেটা অ্যারে নষ্ট করবে। উভয়ই দুর্দান্ত পদ্ধতি, উভয়ই কোনও বিকাশকারী সরঞ্জাম বাক্সে সংরক্ষণাগারভুক্ত হওয়া দরকার। আপনার প্রয়োজনের ভিত্তিতে আপনি খুঁজে পেতে পারেন আপনার আর্কাইভগুলিতে আপনার উভয় ধারণার প্রয়োজন actually


1

আমি উত্তরটি ডার্কওয়াল্টজ 4 এর বংশবৃদ্ধির জন্য গ্রহণ করেছি এবং আমি ভাগ করে নিতে চাই যে আমি যে পরিস্থিতিতে এমন পরিস্থিতিতে কীভাবে অ্যারেতে প্রতিটি পুনরাবৃত্তির জন্য বিভিন্ন কী থাকতে পারে তার সমাধানটি কীভাবে গ্রহণ করেছি:

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' => ' ' );

অ্যারে_সেমে $ মাস্টার_কি এর উপর ভিত্তি করে অ্যারে [1] পুনরাবৃত্তির মধ্যে মার্জটি সম্পাদন করে এবং সেই পুনরাবৃত্তির জন্য ['কিছু_কি'] = '', একটি খালি মান উত্পাদন করে। অতএব, অ্যারে_ইন্টারসেকট_কিটি প্রতিটি পুনরাবৃত্তির মধ্যে $ মাস্টার_কিকে এভাবে পরিবর্তন করতে ব্যবহৃত হত:

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

0

কিছুটা দেরি হয়ে গেছে, তবে আমি এটি কার্যকর করার উপায়টি খুঁজে পাইনি, এই সংস্করণটির বন্ধ হওয়া দরকার, পিএইচপি> = 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' বাছাই করা দরকার, এবং উদাহরণে প্রথম প্রদর্শিত হতে পারে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.