পিএইচপি-তে আপনি কীভাবে অ্যারে এলিমেন্টের কীটি পরিবর্তন করবেন?


348

আমার আকারে একটি সহযোগী অ্যারে রয়েছে key => valueযেখানে কীটি একটি সংখ্যাসূচক মান হয় তবে এটি ক্রমিক সংখ্যাসূচক মান নয়। কীটি আসলে একটি আইডি নম্বর এবং মান একটি গণনা। এটি বেশিরভাগ ক্ষেত্রে উদাহরণস্বরূপ, তবে আমি এমন একটি ফাংশন চাই যা অ্যারের মানব-পঠনযোগ্য নাম পায় এবং মানটি পরিবর্তন না করে কীটির জন্য এটি ব্যবহার করে।

আমি এটি করে এমন কোনও ফাংশন দেখিনি, তবে আমি ধরে নিচ্ছি যে আমার কাছে পুরানো কী এবং নতুন কী সরবরাহ করা দরকার (যা উভয়ই আমার আছে) এবং অ্যারের রূপান্তর করতে হবে। এটি করার একটি কার্যকর উপায় আছে?


উত্তর:


576
$arr[$newkey] = $arr[$oldkey];
unset($arr[$oldkey]);

5
কেবলমাত্র সাবধান হন যে 1) কোনও দুটি কী-তে একইরকম মানব-পঠনযোগ্য সংস্করণ নেই 2) কোনও মানব-পঠনযোগ্য সংস্করণ সংখ্যার মতো হবে না
গ্রেগ

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

7
হ্যাঁ, দুর্দান্ত পয়েন্ট রবিন একই আদেশ রাখার উপায় আছে কি? বা এটি অর্জনের জন্য আপনার একটি নতুন অ্যারে তৈরি করা দরকার?
সাইমন পূর্ব

40
বোনাস প্রশ্ন: কীভাবে আইডি পরিবর্তন করবেন তবে অ্যারে অর্ডার সংরক্ষণ করবেন?
পেট্র পেলার

17
মূল মানটি পরিবর্তন না হলে আপনি একটি অ্যারের উপাদান মুছবেন। আপনি এটি পরীক্ষা করতে চাইতে পারেন।
পিইচ

97

অ্যারের ক্রমটি আপনি কীভাবে সংরক্ষণ করবেন এবং সংরক্ষণ করবেন তা হ'ল অ্যারে কীগুলি একটি আলাদা অ্যারেতে রেখে, সেই অ্যারের মধ্যে কীটি সন্ধান করুন এবং প্রতিস্থাপন করুন এবং তারপরে মানগুলির সাথে এটি আবার একত্রিত করুন।

এখানে একটি ফাংশন যা কেবল এটি করে:

function change_key( $array, $old_key, $new_key ) {

    if( ! array_key_exists( $old_key, $array ) )
        return $array;

    $keys = array_keys( $array );
    $keys[ array_search( $old_key, $keys ) ] = $new_key;

    return array_combine( $keys, $array );
}

2
ধন্যবাদ এটি সত্যিই সহায়ক হিসাবে আমি অ্যারের ক্রম সংরক্ষণ করার প্রয়োজন ছিল। আমি এই পৃষ্ঠাটি সন্ধানের আগেই ইতিমধ্যে গ্রহণযোগ্য উত্তরটি চেষ্টা করেছি।
গিলিটেক

3
হ্যাঁ অনেকগুলি অ্যারের ক্রম সংরক্ষণ করা পছন্দ করে, দেখতে আরও সুন্দর।
ফিল কুক

2
কী অর্ডারটি সংরক্ষণ করতে হবে, ভাল, একটি কবজির মতো কাজ করেছিল!
শিখর

আপনি যদি পারফরম্যান্স বা অর্ডার সংরক্ষণ চান তবে মাইন্ড করুন: stackoverflow.com/a/58619985/1617857
Loo Benoist

54

যদি আপনার arrayএকটি ডাটাবেস ক্যোয়ারী থেকে নির্মিত হয়, আপনি সরাসরি mysqlবিবৃতি থেকে কীটি পরিবর্তন করতে পারেন :

পরিবর্তে

"select ´id´ from ´tablename´..."

যেমন কিছু ব্যবহার করুন:

"select ´id´ **as NEWNAME** from ´tablename´..."

দুর্দান্ত উত্তর, খুব মূল্যবান!
দেবমৌতারে

20

কার্নেলএম থেকে উত্তরটি দুর্দান্ত, তবে মন্তব্য (বিবাদী কী) -এ গ্রেগের উত্থাপিত সমস্যাটি এড়াতে নতুন অ্যারে ব্যবহার করা আরও নিরাপদ হবে

$newarr[$newkey] = $oldarr[$oldkey];
$oldarr=$newarr;
unset($newarr);

এটি একটি ভাল সমাধান, যতক্ষণ না আপনার অ্যারে যুক্তিসঙ্গত আকারের হয়। যদি আপনার অ্যারে উপলব্ধ পিএইচপি মেমরির অর্ধেকেরও বেশি খরচ করে তবে এটি কাজ করবে না।
কিংজেফ্রে

12
পছন্দ করেছেন অ্যারে মানগুলি ততক্ষণ নকল করা হবে না যতক্ষণ না সেগুলি পরিবর্তন না করে "স্রেফ অনুলিপি করা হয়"। উদাহরণস্বরূপ, যদি এমন একটি অ্যারে রয়েছে যেখানে 10'000 উপাদান রয়েছে এবং 40MB মেমরি গ্রহণ করে, এটি অনুলিপি করা 10'000 কেবলমাত্র মানগুলির অনুলিপিগুলির চেয়ে ইতিমধ্যে বিদ্যমান মানগুলির রেফারেন্সগুলি সংরক্ষণ করার জন্য প্রয়োজনীয় মেমরি গ্রাস করবে , সুতরাং যদি 1 অ্যারে 40MB গ্রহণ করে তবে তার অনুলিপি হতে পারে 0.5MB (পরীক্ষিত) গ্রাস করতে পারে।
বাইনারিএলভি

17

আপনি দ্বিতীয় সহকারী অ্যারে ব্যবহার করতে পারেন যা আইডিতে মানুষের পাঠযোগ্য নামগুলি মানচিত্র করে। এটি অনেকের মধ্যে 1 সম্পর্ক সরবরাহ করবে would তারপরে এমন কিছু করুন:

echo 'Widgets: ' . $data[$humanreadbleMapping['Widgets']];

11

আপনি যদি নতুন অ্যারে কীটির অবস্থানটি পুরানোটির মতো দেখতে চান তবে আপনি এটি করতে পারেন:

function change_array_key( $array, $old_key, $new_key) {
    if(!is_array($array)){ print 'You must enter a array as a haystack!'; exit; }
    if(!array_key_exists($old_key, $array)){
        return $array;
    }

    $key_pos = array_search($old_key, array_keys($array));
    $arr_before = array_slice($array, 0, $key_pos);
    $arr_after = array_slice($array, $key_pos + 1);
    $arr_renamed = array($new_key => $array[$old_key]);

    return $arr_before + $arr_renamed + $arr_after;
}

7

যদি আপনার অ্যারেটি পুনরাবৃত্তি হয় তবে আপনি এই ফাংশনটি ব্যবহার করতে পারেন: এই ডেটাটি পরীক্ষা করুন:

    $datos = array
    (
        '0' => array
            (
                'no' => 1,
                'id_maquina' => 1,
                'id_transaccion' => 1276316093,
                'ultimo_cambio' => 'asdfsaf',
                'fecha_ultimo_mantenimiento' => 1275804000,
                'mecanico_ultimo_mantenimiento' =>'asdfas',
                'fecha_ultima_reparacion' => 1275804000,
                'mecanico_ultima_reparacion' => 'sadfasf',
                'fecha_siguiente_mantenimiento' => 1275804000,
                'fecha_ultima_falla' => 0,
                'total_fallas' => 0,
            ),

        '1' => array
            (
                'no' => 2,
                'id_maquina' => 2,
                'id_transaccion' => 1276494575,
                'ultimo_cambio' => 'xx',
                'fecha_ultimo_mantenimiento' => 1275372000,
                'mecanico_ultimo_mantenimiento' => 'xx',
                'fecha_ultima_reparacion' => 1275458400,
                'mecanico_ultima_reparacion' => 'xx',
                'fecha_siguiente_mantenimiento' => 1275372000,
                'fecha_ultima_falla' => 0,
                'total_fallas' => 0,
            )
    );

ফাংশনটি এখানে:

function changekeyname($array, $newkey, $oldkey)
{
   foreach ($array as $key => $value) 
   {
      if (is_array($value))
         $array[$key] = changekeyname($value,$newkey,$oldkey);
      else
        {
             $array[$newkey] =  $array[$oldkey];    
        }

   }
   unset($array[$oldkey]);          
   return $array;   
}

7
$array = [
    'old1' => 1
    'old2' => 2
];

$renameMap = [
    'old1' => 'new1',   
    'old2' => 'new2'
];

$array = array_combine(array_map(function($el) use ($renameMap) {
    return $renameMap[$el];
}, array_keys($array)), array_values($array));

/*
$array = [
    'new1' => 1
    'new2' => 2
];
*/

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

6

আমি কার্নেলএমের সমাধানটি পছন্দ করি তবে আমার এমন কিছু দরকার ছিল যা সম্ভাব্য মূল বিরোধগুলি পরিচালনা করতে পারে (যেখানে একটি নতুন কী কোনও বিদ্যমান কীটির সাথে মেলে)। আমি এখানে যা এলাম:

function swapKeys( &$arr, $origKey, $newKey, &$pendingKeys ) {
    if( !isset( $arr[$newKey] ) ) {
        $arr[$newKey] = $arr[$origKey];
        unset( $arr[$origKey] );
        if( isset( $pendingKeys[$origKey] ) ) {
            // recursion to handle conflicting keys with conflicting keys
            swapKeys( $arr, $pendingKeys[$origKey], $origKey, $pendingKeys );
            unset( $pendingKeys[$origKey] );
        }
    } elseif( $newKey != $origKey ) {
        $pendingKeys[$newKey] = $origKey;
    }
}

তারপরে আপনি এই জাতীয় অ্যারের মাধ্যমে চক্রটি চালিয়ে যেতে পারেন:

$myArray = array( '1970-01-01 00:00:01', '1970-01-01 00:01:00' );
$pendingKeys = array();
foreach( $myArray as $key => $myArrayValue ) {
    // NOTE: strtotime( '1970-01-01 00:00:01' ) = 1 (a conflicting key)
    $timestamp = strtotime( $myArrayValue );
    swapKeys( $myArray, $key, $timestamp, $pendingKeys );
}
// RESULT: $myArray == array( 1=>'1970-01-01 00:00:01', 60=>'1970-01-01 00:01:00' )

6

এটি অর্জনের জন্য এখানে একটি সহায়ক ফাংশন রয়েছে:

/**
 * Helper function to rename array keys.
 */
function _rename_arr_key($oldkey, $newkey, array &$arr) {
    if (array_key_exists($oldkey, $arr)) {
        $arr[$newkey] = $arr[$oldkey];
        unset($arr[$oldkey]);
        return TRUE;
    } else {
        return FALSE;
    }
}

@ কার্নেলএম উত্তরের উপর ভিত্তি করে সুন্দর ।

ব্যবহার:

_rename_arr_key('oldkey', 'newkey', $my_array);

এটি সফল পুনরায় নামকরণে সত্য হবে , অন্যথায় মিথ্যা


সচেতন হন যে এটি অ্যারের ক্রমকে পরিবর্তিত করে (পুনর্নবীকরণকৃত কীটির উপাদান অ্যারের শেষে থাকবে, অ্যারেতে একই অবস্থানে থাকবে না যেমন এটি ছিল মূলত)। এছাড়াও আমি সাধারণত একটি আন্ডারস্কোর দিয়ে কোনও ফাংশন নাম শুরু করতাম না (যা internalতিহ্যগতভাবে বিশেষ অভ্যন্তরীণ ব্যবহারের কার্যকারিতা নির্ধারণ করতে ব্যবহৃত হয়)।
অরর্ড

4

সহজ জিনিস:

এই ফাংশনটি লক্ষ্য accept হ্যাশ গ্রহণ করবে এবং ments প্রতিস্থাপনগুলি হ্যাশও রয়েছে যা নিউকি => পুরাতনকি সংযুক্তি রয়েছে

এই ফাংশনটি মূল অর্ডার সংরক্ষণ করবে , তবে পারফরম্যান্স এবং মেমরির ক্ষেত্রে খুব বড় (10 কে রেকর্ডের উপরের মতো) অ্যারেগুলির জন্য সমস্যাযুক্ত হতে পারে ।

function keyRename(array $hash, array $replacements) {
    $new=array();
    foreach($hash as $k=>$v)
    {
        if($ok=array_search($k,$replacements))
            $k=$ok;
        $new[$k]=$v;
    }
    return $new;    
}

এই বিকল্প ফাংশনটি হ'ল মূল ক্রমটি হারাতে (যা হ্যাশটেবল হওয়ার কারণে কোনও সমস্যা হওয়া উচিত নয়!) মূল অর্ডারটি ছাড়িয়ে যাওয়ার চেয়ে আরও ভাল পারফরম্যান্স এবং মেমরির ব্যবহারের সাথে একই কাজ করবে )

function keyRename(array $hash, array $replacements) {

    foreach($hash as $k=>$v)
        if($ok=array_search($k,$replacements))
        {
          $hash[$ok]=$v;
          unset($hash[$k]);
        }

    return $hash;       
}

4

এই কোডটি পুরানোকে নতুনতে পরিবর্তন করতে সহায়তা করবে

$i = 0;
$keys_array=array("0"=>"one","1"=>"two");

$keys = array_keys($keys_array);

for($i=0;$i<count($keys);$i++) {
    $keys_array[$keys_array[$i]]=$keys_array[$i];
    unset($keys_array[$i]);
}
print_r($keys_array);

মত প্রদর্শন

$keys_array=array("one"=>"one","two"=>"two");

3

উভয় সমাধানের সাধারণ মানদণ্ডের তুলনা।

সমাধান 1 অনুলিপি করুন এবং মুছে দিন (অর্ডার হারিয়েছে) https://stackoverflow.com/a/240676/1617857

for ($i =0; $i < 100000000; $i++){
    $array = ['test' => 'value'];
    $array['test2'] = $array['test'];
    unset($array['test']);
}

সমাধান 2 কী https://stackoverflow.com/a/21299719/1617857 নামকরণ করুন

for ($i =0; $i < 100000000; $i++){
    $array = ['test' => 'value'];
    $keys = array_keys( $array );
    $keys[array_search('test', $keys, true)] = 'test2';
    array_combine( $keys, $array );
}

ফলাফল:

php solution1.php  6.33s  user 0.02s system 99% cpu 6.356  total
php solution1.php  6.37s  user 0.01s system 99% cpu 6.390  total
php solution2.php  12.14s user 0.01s system 99% cpu 12.164 total
php solution2.php  12.57s user 0.03s system 99% cpu 12.612 total

2

আপনি অ্যারে_ওয়াকের উপর ভিত্তি করে এই ফাংশনটি ব্যবহার করতে পারেন:

function mapToIDs($array, $id_field_name = 'id')
{
    $result = [];
    array_walk($array, 
        function(&$value, $key) use (&$result, $id_field_name)
        {
            $result[$value[$id_field_name]] = $value;
        }
    );
    return $result;
}

$arr = [0 => ['id' => 'one', 'fruit' => 'apple'], 1 => ['id' => 'two', 'fruit' => 'banana']];
print_r($arr);
print_r(mapToIDs($arr));

এটি দেয়:

Array(
    [0] => Array(
        [id] => one
        [fruit] => apple
    )
    [1] => Array(
        [id] => two
        [fruit] => banana
    )
)

Array(
    [one] => Array(
        [id] => one
        [fruit] => apple
    )
    [two] => Array(
        [id] => two
        [fruit] => banana
    )
)

1

এটি প্রথম কীটির নামকরণের জন্য কাজ করে:

$a = ['catine' => 'cat', 'canine'  => 'dog'];
$tmpa['feline'] = $a['catine'];
unset($a['catine']);
$a = $tmpa + $a;

তারপরে, মুদ্রণ_আর ($ এ) একটি মেরামত করা অর্ডারের অ্যারে উপস্থাপন করে:

Array
(
    [feline] => cat
    [canine] => dog
)

এটি একটি স্বেচ্ছাসেবক কীটির নামকরণের জন্য কাজ করে:

$a = ['canine'  => 'dog', 'catine' => 'cat', 'porcine' => 'pig']
$af = array_flip($a)
$af['cat'] = 'feline';
$a = array_flip($af)

print_r ($ ক)

Array
(
    [canine] => dog
    [feline] => cat
    [porcine] => pig
)

একটি সাধারণ কার্য:

function renameKey($oldkey, $newkey, $array) {
    $val = $array[$oldkey];
    $tmp_A = array_flip($array);
    $tmp_A[$val] = $newkey;

    return array_flip($tmp_A);
}

1

আপনি যদি একবারে কয়েকটি কী প্রতিস্থাপন করতে চান (অর্ডার সংরক্ষণ করে):

/**
 * Rename keys of an array
 * @param array $array (asoc)
 * @param array $replacement_keys (indexed)
 * @return array
 */
function rename_keys($array, $replacement_keys)  {
      return array_combine($replacement_keys, array_values($array));
}

ব্যবহার:

$myarr = array("a" => 22, "b" => 144, "c" => 43);
$newkeys = array("x","y","z");
print_r(rename_keys($myarr, $newkeys));
//must return: array("x" => 22, "y" => 144, "z" => 43);

1

পূর্ণ অ্যারের সাথে কাজ করার সময় অ্যারের উপাদানটির কীটি পরিবর্তন করার বিকল্প উপায় রয়েছে - অ্যারের ক্রম পরিবর্তন না করে। এটি অ্যারেটিকে নতুন অ্যারেতে অনুলিপি করা সহজ।

উদাহরণস্বরূপ, আমি একটি মিশ্র, বহু-মাত্রিক অ্যারে নিয়ে কাজ করছি যাতে ইনডেক্সড এবং এসোসিয়েটিভ কী রয়েছে - এবং আমি অর্ডারটি ভঙ্গ না করে পূর্ণ মানের কীগুলি তাদের মানগুলির সাথে প্রতিস্থাপন করতে চেয়েছিলাম।

আমি সমস্ত সংখ্যার অ্যারে এন্ট্রিগুলির জন্য কী / মানটি স্যুইচ করে এটি করেছি - এখানে: ['0' => 'foo']। মনে রাখবেন যে আদেশটি অক্ষত।

<?php
$arr = [
    'foo',
    'bar'=>'alfa',
    'baz'=>['a'=>'hello', 'b'=>'world'],
];

foreach($arr as $k=>$v) {
    $kk = is_numeric($k) ? $v : $k;
    $vv = is_numeric($k) ? null : $v;
    $arr2[$kk] = $vv;
}

print_r($arr2);

আউটপুট:

Array (
    [foo] => 
    [bar] => alfa
    [baz] => Array (
            [a] => hello
            [b] => world
        )
)

1

সর্বোত্তম উপায় হ'ল রেফারেন্স ব্যবহার করা, এবং আনসেট ব্যবহার না করা (যা স্মৃতি পরিষ্কার করার জন্য আরও একটি পদক্ষেপ করে)

$tab = ['two' => [] ];

সমাধান:

$tab['newname'] = & $tab['two'];

আপনার নতুন নামের সাথে একটি মূল এবং একটি রেফারেন্স রয়েছে।

অথবা আপনি যদি না চান তবে একটি মানে দুটি নাম রাখা ভাল অন্য ট্যাব তৈরি করুন এবং রেফারেন্সে ভবিষ্যদ্বাণী করুন

foreach($tab as $key=> & $value) {
    if($key=='two') { 
        $newtab["newname"] = & $tab[$key];
     } else {
        $newtab[$key] = & $tab[$key];
     }
}

সমস্ত অ্যারের ক্লোন করার চেয়ে কীগুলিতে ইটারেরেশন করা ভাল এবং আপনার যদি 100 টি সারি +++ ইত্যাদির মতো লম্বা ডেটা থাকে তবে পুরানো অ্যারে পরিষ্কার করা is


0

হুম, আমি এর আগে পরীক্ষা করিনি, তবে আমি মনে করি এই কোডটি কাজ করছে

function replace_array_key($data) {
    $mapping = [
        'old_key_1' => 'new_key_1',
        'old_key_2' => 'new_key_2',
    ];

    $data = json_encode($data);
    foreach ($mapping as $needed => $replace) {
        $data = str_replace('"'.$needed.'":', '"'.$replace.'":', $data);
    }

    return json_decode($data, true);
}

জসন এনকোড এবং ডিকোড? এটি একটি সত্যই খারাপ উত্তর।
কিক্সরজ

0

যেগুলি সংরক্ষণকরা অর্ডার করছেন সেটি বোঝার জন্য সহজ:

function rename_array_key(array $array, $old_key, $new_key) {
  if (!array_key_exists($old_key, $array)) {
      return $array;
  }
  $new_array = [];
  foreach ($array as $key => $value) {
    $new_key = $old_key === $key
      ? $new_key
      : $key;
    $new_array[$new_key] = $value;
  }
  return $new_array;
}

0

আপনি সরল ফাংশন লিখতে পারেন যা প্রদত্ত অ্যারেগুলির কীগুলিতে কলব্যাক প্রয়োগ করে। অনুরূপ array_map

<?php
function array_map_keys(callable $callback, array $array) {
    return array_merge([], ...array_map(
        function ($key, $value) use ($callback) { return [$callback($key) => $value]; },
        array_keys($array),
        $array
    ));
}

$array = ['a' => 1, 'b' => 'test', 'c' => ['x' => 1, 'y' => 2]];
$newArray = array_map_keys(function($key) { return 'new' . ucfirst($key); }, $array);

echo json_encode($array); // {"a":1,"b":"test","c":{"x":1,"y":2}}
echo json_encode($newArray); // {"newA":1,"newB":"test","newC":{"x":1,"y":2}}

এখানে একটি সংক্ষিপ্তসার https://gist.github.com/vardius/650367e15abfb58bcd72ca47eff096ca#file-array_map_keys-php


0

এই ফাংশনটি সূচী অনুসন্ধানের সাথে একত্রিত করে একটি অবস্থানের অবস্থানটি ধরে রেখে একটি অ্যারে কীটির নতুন নামকরণ করবে।

function renameArrKey($arr, $oldKey, $newKey){
    if(!isset($arr[$oldKey])) return $arr; // Failsafe
    $keys = array_keys($arr);
    $keys[array_search($oldKey, $keys)] = $newKey;
    $newArr = array_combine($keys, $arr);
    return $newArr;
}

ব্যবহার:

$arr = renameArrKey($arr, 'old_key', 'new_key');

-1

এই বেসিক ফাংশনটি অ্যারে কীগুলি অদলবদল করে এবং অ্যারেটিকে মূল ক্রমে রেখে দেয় ...

public function keySwap(array $resource, array $keys)
{
    $newResource = [];

    foreach($resource as $k => $r){
        if(array_key_exists($k,$keys)){
            $newResource[$keys[$k]] = $r;
        }else{
            $newResource[$k] = $r;
        }
    }

    return $newResource;
}

এরপরে আপনি ল্যাপটপ করতে এবং উদাহরণস্বরূপ 'z' দিয়ে সমস্ত 'একটি' কীগুলি স্যুপ করতে পারবেন ...

$inputs = [
  0 => ['a'=>'1','b'=>'2'],
  1 => ['a'=>'3','b'=>'4']
]

$keySwap = ['a'=>'z'];

foreach($inputs as $k=>$i){
    $inputs[$k] = $this->keySwap($i,$keySwap);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.