0

さて、私は必要以上の情報を含む大規模な多次元配列を使用しています。ループして、関心のあるデータをフィルター処理したいと考えています。悲しいことに、この多次元配列は動的に生成され、常に含まれているとは限りません必要なデータなので、次のようなロジックを使用する必要があります。

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 を使用した 2 回目の試みはうまくいきましたが、自分のソリューションにはあまり満足していません。これは私が皆さんに来てもらいたいところです、これを行うより良い方法はありますか? 以下は私の試みです:

<?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?

}
4

2 に答える 2

1

あなたが試すことができます

$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

于 2012-10-30T19:08:02.297 に答える