0

コード:

$a = array();
$a[] = 'a';
$a[] = 'b';
$a[] = 'c';
$a[] = array('e', 'f', array('g', '3'), 'c');
$a[] = 'd';

これはうまくいきます:

return $a[3][2][1];

それは「3」を与えます。しかし、プログラムでそれを行う必要がある場合はどうすればよいでしょうか? 探し物か何か?

4

3 に答える 3

1
Using these 2 functions will search multidimensional arrays and return ALL matching paths (items) NOT just a single item.



if(!function_exists('array_search_recursive')){
    function array_search_recursive($needle, $haystack, $key_lookin=""){
    $path = NULL;
    if (!empty($key_lookin) && array_key_exists($key_lookin, $haystack) && $needle === $haystack[$key_lookin]) {
    $path[] = $key_lookin;
    } else {
    foreach($haystack as $key => $val) {
    if (is_scalar($val) && $val === $needle && empty($key_lookin)) {
    $path[] = $key;
    break;
    } elseif (is_array($val) && $path = array_search_recursive($needle, $val, $key_lookin)) {
    array_unshift($path, $key);
    break;
    }
    }
    }
    return $path;
    }
    }



    // Recursive backtracking function for multidimensional array search
    if(!function_exists('search_r')){
    function search_r($value, $array){
    $results = array();

    if(is_array($array)){
    $path = array_search_recursive($value, $array);
    if (is_array($path) && count($path) > 0){
    $results[] = $path;
    unset($array[$path[0]]);
    $results = array_merge($results, search_r($value, $array));
    }else{

    }
    }

    return $results;
    }
    }
于 2012-08-19T14:05:51.737 に答える
1
/**
     * Searches haystack for needle and 
     * returns an array of the key path if 
     * it is found in the (multidimensional) 
     * array, FALSE otherwise.
     *
     * @mixed array_searchRecursive ( mixed needle, 
     * array haystack [, bool strict[, array path]] )
     */

function array_searchRecursive( $needle, $haystack, $strict=false, $path=array() )
{
    if( !is_array($haystack) ) {
        return false;
    }

    foreach( $haystack as $key => $val ) {
        if( is_array($val) && $subPath = array_searchRecursive($needle, $val, $strict, $path) ) {
            $path = array_merge($path, array($key), $subPath);
            return $path;
        } elseif( (!$strict && $val == $needle) || ($strict && $val === $needle) ) {
            $path[] = $key;
            return $path;
        }
    }
    return false;
}
于 2012-08-19T14:00:30.463 に答える
1

array_walk_recursiveを使用して、配列要素を含む配列の各要素を調べることもできますが、OOP アプローチを使用して項目のオブジェクトを作成する (そしておそらくそれらの内部に配列を隠す) ほうが、はるかに直感的になります。

array_walk_recursive の例:

<?php
$sweet = array('a' => 'apple', 'b' => 'banana');
$fruits = array('sweet' => $sweet, 'sour' => 'lemon');

function test_print($item, $key)
{
    echo "$key holds $item\n";
}

array_walk_recursive($fruits, 'test_print');
?>

出力:

a holds apple
b holds banana
sour holds lemon

クラスの例は次のようになります。

class mySubArray
{
    public $element1='e';
    public $element2='f';
    public $element3=array();
    public $element4='c';
}

class mySomething
{
    public $var1='a';
    public $var2='b';
    public $var3='c';
    public $var4=array();
    public $var5='d';

    public function __construct()
    {
        $this->var4= new mySubArray();
        $this->var4->element3[0]='g';
        $this->var4->element3[0]='3';
    }
}

$myObject = new mySomething();

次に、次のようにプロパティにアクセスできます。

echo $myObject->var3; // Output: c
echo $myObject->var4->element2; // output: f
于 2012-08-19T13:49:24.377 に答える