PHP: Bir değer retreive bir dizi dizin yolu olarak bir dizeyi kullanın

6 Cevap php

Ben gibi bir dizi var ki:

Array
(
    [0] => Array
        (
            [Data] => Array
                (
                    [id] => 1
                    [title] => Manager
                    [name] => John Smith
                )
         )
    [1] => Array
        (
            [Data] => Array
                 (
                     [id] => 1
                     [title] => Clerk
                     [name] =>
                         (
                             [first] => Jane
                             [last] => Smith
                         )
                 )

        )

)

Ben dizi dizin yolu olarak hareket ve eval kullanmadan uygun dizisi değerini döndürür () olacak ben bir dize iletebilirsiniz bir işlev oluşturmak mümkün olmak istiyorum. Bu mümkün mü?

function($indexPath, $arrayToAccess)
{
    //$indexPath would be something like [0]['Data']['name'] which would return 
    //"Manager" or it could be [1]['Data']['name']['first'] which would return 
    //"Jane" but the amount of array indexs that will be in the index path can 
    //change, so there might be 3 like the first example, or 4 like the second.

    return $arrayToAccess[$indexPath] <-obviously wont work
}

6 Cevap

: Eğer yolu olarak bir dizi (soldan sağa), daha sonra bir özyinelemeli işlevini kullanabilirsiniz

$indexes = {0, 'Data', 'name'};

function get_value($indexes, $arrayToAccess)
{
   if(count($indexes) > 1) 
    return get_value(array_slice($indexes, 1), $arrayToAccess[$indexes[0]]);
   else
    return $arrayToAccess[$indexes[0]];
}

A Bit sonra, ama ... umut birisi yardımcı olur:

// $pathStr = "an:string:with:many:keys:as:path";
$paths = explode(":", $pathStr); 
$itens = $myArray;
foreach($paths as $ndx){
    $itens = $itens[$ndx];
}

Şimdi itens istedin dizinin parçasıdır.

[] 'S

Labs

Sen indexPath dizeyi ayrıştırmak zorunda. Bazı ayırıcı seçti (örneğin ".") Kadar metni okuyun "." ilk anahtar olacaktır, ardından bir sonraki kadar geri kalanını okumak, bir sonraki anahtar olacaktır. Artık nokta kadar yapacağını.

Dizideki Sen ken mağaza anahtarı. Seeked eleman almak için bu dizide foreach döngü yapmak.

Eğer zaten neden bunu yapmak için bir işlev yazmak dışarı çekerek tam dizi elemanını biliyorum? Sadece nesi var

$array[0]['data']['title']

Dize ayrıştırma gitmek istediğiniz yolu ise burada işi yapmak için tek yoldur.

$data[0]["Data"]["stuff"] = "cake";

$path = "[0][\"Data\"]['stuff']";

function indexPath($path,$array){
    preg_match_all("/\[['\"]*([a-z0-9_-]+)['\"]*\]/i",$path,$matches);

    if(count($matches[1]) > 0) {
        foreach ($matches[1] as $key) {
                if (isset($array[$key])) {
                        $array = $array[$key];
                } else {
                        return false;
                }
        }
    } else {
        return false;
    }

return $array;
}

print_r(indexPath($path,$data));

A preg_match_all, eşleşen sonuçlar üzerinden bisiklet istediğin sonuca yakın verecekti. Sen kayıp bilgi için burada listelenen stratejiler tüm dikkatli olmak gerekir. Örneğin, 55 türü int olarak kalır ve tipi dize olarak çözümlenen olmadığından emin olmak için bir yol bulmak zorunda.