7

私は次の配列を持っています(以下で呼ばれ$example_arrayます):

array(3) {
  ["id"]=> string(4) "123"
  ["name"]=>
      array(1) {
        ["first"]=> string(3) "pete"
        ["last"]=> string(3) "foo"
      }
  ["address"]=>
      array(1) {
        ["shipping"]=>
            array(1) {
              ["zip"]=> string(4) "1234"
              ["country"]=> string(4) "USA"
            }
      }
}

このような配列に対して実行して一致するものを探すことができる関数が欲しいのですが。これが私が実行できるようにしたい検索です:

// These should return true:
search( $example_array, array( 'id' => '123' ) );
search( $example_array, array( 'name' => array( 'first' => 'pete' ) );
search( $example_array, array( 'address' => array( 'shipping' => array( 'country' => 'USA' ) ) );

// These don't have to return true:
search( $example_array, array( 'first' => 'pete' ) );
search( $example_array, array( 'country' => 'USA' ) );

使用できるPHP内部関数はありますか、それとも自分でコーディングする必要がありますか?

4

3 に答える 3

7
function search($array, $b) {
    $ok = true;
    foreach ($b as $key => $value) {
        if (!isset($array[$key])) { $ok = false; break; }
        if (!is_array($value))
            $ok = ($array[$key] == $value);
        else 
            $ok = search($array[$key], $value);
        if ($ok === false) break;
    }
    return $ok;
}

これがテストスクリプトです。

于 2012-12-27T11:36:50.627 に答える
1

この関数が役立つことを願っています:

public function matchArray(&$arrayToSearch, $valueToMatch = array()){
    if(!is_array($valueToMatch))
        $valueToMatch = array($valueToMatch);

    $exists = false;
    $indexToMatch = array_keys($valueToMatch);

    foreach($indexToMatch as $ind){
        if(array_key_exists($ind, $arrayToSearch)){
            $valToMatch = $valueToMatch[$ind];
            $value = $arrayToSearch[$ind];
            $valType = gettype($value);
            $valToMatch = $valueToMatch[$ind];
            if($valType == gettype($valToMatch) || is_numeric($valToMatch)){
                if($valType == 'array'){
                    $exists = $this->matchArray($value, $valToMatch);
                } else if(($valType == 'string' || is_numeric($valToMatch)) && $valToMatch == $value) {
                    $exists = true;
                } else {
                    $exists = false;
                    break;
                }
            }
        }
    }

    return $exists;
}
于 2012-12-27T14:21:11.563 に答える
0

iirc、あなたがやりたいことをするためのビルトインはありません。

これが(テストされていない)バージョンarray_walkです:

function search($data,$match) {
   return  array_walk($match, function($v,$k) use ($data) {
      if (isset($data[$k])){
         if (is_array($v)) return search($data[$k],$v);
         return ($v == $data[$k]);
      });
      return false;
 }

やや簡潔ですが(でうまくいく可能性があります?:)、おそらくあまり読みやすくありません。ラムダはphpへの素晴らしい追加です!

別の可能な解決策がありますが、一見不十分です(確認するためにベンチマークする必要があります):

 function search($d,$m) {
    return is_empty(array_diff_assoc(array_intersect_assoc($d,$m), $m));
 }

使用されているビルトインが再帰的でない場合は、機能しない可能性があります。

于 2012-12-27T12:08:40.837 に答える