PHP, nasıl bir dizi elemanın anahtarını değiştiririm?

6 Cevap php

Ben ancak sıralı bir sayısal değer değil, key => value tuşuna bir sayısal değerdir şeklinde bir ilişkisel dizi var. Anahtar aslında bir kimlik numarası ve değer sayısıdır. Bu, çoğu durumda gayet iyi olduğunu, ancak ben dizinin insan okunabilir adını alır ve kullanan bir işlevi istediğiniz anahtar için, değerini değiştirmeden.

Ben bunu yapan bir fonksiyonu görmedim, ama ben eski anahtar ve yeni anahtar (Ben her ikisi de) sağlamak ve dizi dönüştürmek gerekir varsayarak yaşıyorum. Bunu yapmanın etkili bir yolu var mı?

6 Cevap

diziniz bir veritabanı sorgusu yapılmış ise, doğrudan mysql deyimi anahtarını değiştirebilirsiniz:

yerine

"'Tabloismi' den 'id' seçeneğini seçin ..."

gibi bir şey kullanabilirsiniz:

"as NEWNAME 'tabloismi' den 'id' seçeneğini seçin ..."

Sen id yıllardan insan okunabilir adları eşler, ikinci bir ilişkisel dizi kullanabilirsiniz. Bu da 1 ilişki için birçok sağlayacaktır. Sonra böyle bir şey yapın:

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

KernelM gelen cevabı güzel, ama yeni bir dizi kullanarak, comment (anahtarları çelişkili) yılında Greg tarafından gündeme sorunu önlemek için daha güvenli olacaktır

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

Bunu ve dizinin sıralamasını koruyacak yolu bulmak ve o diziye anahtarını değiştirin ve sonra değerleri ile geri birleştirmek, ayrı bir diziye dizi anahtarları koyarak olduğunu.

İşte yok sadece bir fonksiyonudur:

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

Ben KernelM çözümünü ister, ama ben (yeni bir anahtar mevcut bir anahtarı maç olabilir) potansiyel kilit çatışmaları ele bir şey gerekiyordu. Burada ben ile geldi budur:

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

Böyle bir dizi aracılığıyla sonra döngüsü yapabilirsiniz:

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

If your array is recursive you can use this function: test this data:

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

burada fonksiyonu şudur:

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