Değişken adı olarak PHP dizi

5 Cevap php

Nasıl değişken olarak php dizi için bir dizin ismini göndermek.

dizidir

$array = array('Somthing'=>array('More'=>array('id'=> 34)));

ve şimdi ben bu şeyi göstermek istiyorum ama bir değişken adı ile yüzden ben istiyorum ne yazmak açıklamak için nasıl bilmiyorum.

$index_name = '[Something][More][id]';

$array{$index_name};

Herhangi bir şekilde olabilir mi?

5 Cevap

Birinde böyle gitmez. İşte bunu istiyorum nasıl:

$array['Something']['More']['id']

Eğer özellikle tek bir dize ile erişim çok boyutlu diziler isteseydim, o zaman bunu yapmak için bir işlev oluşturmak olabilir:

function array_multi(Array $arr, $path) {
    $parts = explode(".", $path);

    $curr =& $arr;
    for ($i = 0, $l = count($parts); $i < $l; ++$i) {
        if (!isset($curr[$parts[$i]])) {
            // path doesn't exist
            return null;
        } else if (($i < $l - 1) && !is_array($curr[$parts[$i]]) {
            // path doesn't exist
            return null;
        }
        $curr =& $curr[$parts[$i]];
    }
    return $curr;
}

// usage:
echo array_multi($array, "Something.More.id");    // 34
echo array_multi($array, "Something.More");       // array("id" => 34)

Köşeli parantez ile sözdizimi destekleyen Recursive sürümü:

$array = array('Something'=>array('More'=>array('id'=> 34)));

$string = '[Something][More][id]';

echo scan_array($string, $array);

function scan_array($string, $array) {
    list($key, $rest) = preg_split('/[[\]]/', $string, 2, PREG_SPLIT_NO_EMPTY);
    if ( $key && $rest ) {
        return scan_array($rest, $array[$key]);
    } elseif ( $key ) {
        return $array[$key];
    } else {
        return FALSE;
    }
}

Tamam, ben bu insanların vurulmaz nasıl olduğunu biliyorum. Ama hadi, eval() always yanlış cevap değildir.

$array = array('Something'=>array('More'=>array('id'=> 34)));
$index_name = '[Something][More][id]';
eval('$val = $array'.$index_name.';'); // Wrap in a function or something

Sen eval() ile bunu yapabilirsiniz:

<?php

$array = array('Somthing'=>array('More'=>array('id'=> 34)));
$index_name = "['Somthing']['More']['id']";

$stmt='echo $array'.$index_name.';';
eval($stmt);

?>

UPDATE:

Bazı SO kullanıcıların eval kullanma fikri ile () rahatsız görünüyor. Ben kendi kodunda bu kullanmak için karar vermeden önce read this thread which discusses the pros and cons mantıklı düşünüyorum.

Eğer böyle bir şey yapmak gerek kendinizi köşeye ettiyseniz, size kötü bir şekilde başka bir şey yaptık oldukça iyi bir şans var. Orada bunu yapmak için geçerli nedenler var, ama çok sık değil.

function key_path($arr, $keys) {
    return $keys ? key_path($arr[array_shift($keys)], $keys) : $arr;
}

$arr['Something']['More']['id'] = 34;
$keys = array('Something', 'More', 'id');

var_dump( key_path($arr, $keys));