簡體   English   中英

基於不帶eval的字符串引用多維數組的元素

[英]Referencing a multidimensional array's elements based on a string without eval

好吧,我正在使用一個大型多維數組,該數組中包含的信息超出了我的需要,我想遍歷該多維數組以過濾我感興趣的數據。可悲的是,此多維數組是動態生成的,並不總是包含我想要的數據,所以我必須使用如下邏輯:

if(isset($ar['b']['ba']['baa'])){
echo '<h3>'.$ar['b']['ba']['baa'].'</h3>';
}
if(isset($ar['b']['ba']['baba'])){
echo '<h3>'.$ar['b']['ba']['baba'].'</h3>';
}
if(isset($ar['b']['ba']['babb'])){
echo '<h3>'.$ar['b']['ba']['babb'].'</h3>';
}

上面的方法很棒,但是看起來有點凌亂,所以我將上面的代碼轉換為:

$refAr=array();
$refAr[]='b->ba->baa';//3
$refAr[]='b->ba->bab->baba';//4
$refAr[]='b->ba->bab->babb';//5

上面的代碼看起來更漂亮,更整潔,這是我想控制腳本的方式,以防將來將來需要引用不同的鍵。 我遇到的問題是嘗試使用上述格式來實際引用數組。 我以為變量變量可以工作,但顯然失敗了。 我第二次嘗試使用eval可以成功,但是我對解決方案並不滿意。 這是我需要你們進來的地方,有沒有更好的方法呢? 這是我的以下嘗試:

<?php

$ar=array(
    'a'=>array('aa'=>1,'ab'=>2),
    'b'=>array(
        'ba'=>array('baa'=>3,'bab'=>array('baba'=>4,'babb'=>5),'bac'=>array('baca'=>6,'bacb'=>7)),
    )
);


$refAr=array();
$refAr[]='b->ba->baa';//3
$refAr[]='b->ba->bab->baba';//4
$refAr[]='b->ba->bab->babb';//5
foreach($refAr as $ref)
{
    $r=explode('->',$ref);
    $r="\$ar['".implode("']['",$r)."']";
    echo '<h1>'.$r.'</h1>';
    echo '<h3>'.$$r.'</h3>';//undefined
    eval('$t='.$r.';');
    echo "<h3>$t</h3>";//works but uses eval, is there a better way?

}

你可以試試

$ar = array();
$ar['b']['ba']['baa'] = 3;
$ar['b']['ba']['bab']['baba'] = 4;
$ar['b']['ba']['bab']['babb'] = 5;

$refAr = array();
$refAr[] = 'b->ba->baa'; // 3
$refAr[] = 'b->ba->bab->baba'; // 4
$refAr[] = 'b->ba->bab->babb'; // 5

foreach ( $refAr as $ref ) {
    $t = $ar;
    foreach ( explode("->", $ref) as $v ) {
        if (!isset($t[$v]))
            break;
        $t = $t[$v];
    }
    is_array($t) and $t = null;
    echo "<h3>$t</h3>";
}

輸出量

3

4

5

我決定回答我自己的問題。 這是我最后使用的:

<?php

//Sample PHP representation of dynamically-pulled JSON data from an untrusted source
$ar=array(
    'a'=>array('aa'=>1,'ab'=>2),
    'b'=>array(
        'ba'=>array('baa'=>3,'bab'=>array('baba'=>4,'babb'=>5),'bac'=>array('baca'=>6,'bacb'=>7)),
    )
);

//Reusable function
function resolveReference($ar,&$ref)
{
    $t = $ar;
    foreach ( explode('->',$ref) as $v )
    {
        if (!array_key_exists($v,$t)){$ref=null;return false;}
        $t = $t[$v];
    }
    $ref=$t;
    return true;
}

//The references I'm interested in but don't know if my dynamic data will contain these keys every time
$refAr=array();
$refAr[]='b->ba->baa';
$refAr[]='b->ba->bab->baba';
$refAr[]='b->ba->bab->babb';
$refAr[]='b->doesnt->exist';


foreach($refAr as $ref)
{
    echo '<h1>'.$ref.'</h1>';
    if(resolveReference($ar,$ref))
    {
        echo '<h3><span style="color:blue;">'.$ref.'</span></h3>';
    }else{
        echo '<h3><span style="color:red;">Alternative text for non-existent expected reference</span></h3>';
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM