Skip to content

Instantly share code, notes, and snippets.

@Jeff-Russ
Last active February 18, 2017 05:09
Show Gist options
  • Select an option

  • Save Jeff-Russ/bc96cd2e36c5ddd3dbb09c8bde8d7cb3 to your computer and use it in GitHub Desktop.

Select an option

Save Jeff-Russ/bc96cd2e36c5ddd3dbb09c8bde8d7cb3 to your computer and use it in GitHub Desktop.

Revisions

  1. Jeff-Russ revised this gist Feb 18, 2017. 1 changed file with 56 additions and 56 deletions.
    112 changes: 56 additions & 56 deletions recursive_search.php
    Original file line number Diff line number Diff line change
    @@ -1,44 +1,44 @@
    <?php
    function recursive_search($val, $arr, $mode=1, $strict=true)
    {
    $depth = ($depth=(int)$mode) ? $depth : 0;
    if (strpos($mode, 'all')!==false) {
    $r = function ($val, $a, $d, $s, $l=0, &$path=[], &$keys=[], &$i=0) use (&$r) {
    foreach($a as $k=>$v) {
    $path[] = $k;
    if (!$s && $v==$val || $v===$val) $keys[$i++] = $path;
    elseif ($l<$d && (is_array($v) /*|| method_exists($v,'getIterator')*/))
    $r($val, $v ,$d, $s, $l, $path, $keys, $i);
    array_pop($path);
    }
    if ($l!==0) return $keys ? $keys : false;
    return array_values( $keys );
    };
    } else {
    $r = function ($val, $a, $d, $s, $l=0, $keys=array()) use (&$r) {
    foreach($a as $k=>$v) {
    if (!$s && $v==$val || $v===$val) { $keys[]=$k; return $keys; }
    elseif ($l<$d && (is_array($v) /*|| method_exists($v,'getIterator')*/)) {
    $keys[]=$k;
    if ($keys=$r($val, $v ,$d, $s, $l+1, $keys)) return $keys;
    }
    }
    return false;
    };
    }
    return $r($val, $arr, $depth, $strict);
    $depth = ($depth=(int)$mode) ? $depth : 0;
    if (strpos($mode, 'all')!==false) {
    $r = function ($val, $a, $d, $s, $l=0, &$path=[], &$keys=[], &$i=0) use (&$r) {
    foreach($a as $k=>$v) {
    $path[] = $k;
    if (!$s && $v==$val || $v===$val) $keys[$i++] = $path;
    elseif ($l<$d && (is_array($v) /*|| method_exists($v,'getIterator')*/))
    $r($val, $v ,$d, $s, $l, $path, $keys, $i);
    array_pop($path);
    }
    if ($l!==0) return $keys ? $keys : false;
    return array_values( $keys );
    };
    } else {
    $r = function ($val, $a, $d, $s, $l=0, $keys=array()) use (&$r) {
    foreach($a as $k=>$v) {
    if (!$s && $v==$val || $v===$val) { $keys[]=$k; return $keys; }
    elseif ($l<$d && (is_array($v) /*|| method_exists($v,'getIterator')*/)) {
    $keys[]=$k;
    if ($keys=$r($val, $v ,$d, $s, $l+1, $keys)) return $keys;
    }
    }
    return false;
    };
    }
    return $r($val, $arr, $depth, $strict);
    }

    $arr = array(
    0=>array(1=>array(2=>'depth2') ),
    '1.4' => 0,
    'depth1'=>array('depth1'),
    'arr1'=>array(
    'arr2'=>array(
    'arr3'=>array('findme'),
    0=>array(1=>array(2=>'depth2') ),
    '1.4' => 0,
    'depth1'=>array('depth1'),
    'arr1'=>array(
    'arr2'=>array(
    'arr3'=>array('findme'),
    ),
    ),
    ),
    'findme1'=>array('findme'),
    'findme1'=>array('findme'),
    );
    print_vals(recursive_search('depth1', $arr)); # ['depth1', 0]
    print_vals(recursive_search('depth1', $arr, 0)); # [ ]
    @@ -51,32 +51,32 @@ function recursive_search($val, $arr, $mode=1, $strict=true)
    print_vals(recursive_search('findme', $arr, '3 all')); # ['arr1','arr2','arr3',0]
    /* a third argument containing 'all' and optionally starting with an int
    * will return an array of recursive_search values:
    [
    ['arr1', 'arr2', 'arr3', 0],
    ['findme1', 0],
    ]
    [
    ['arr1', 'arr2', 'arr3', 0],
    ['findme1', 0],
    ]
    */

    ////////////////////////////////////////////////////////////////////////////////
    // just to display demo:
    function print_vals($arr) {
    if (!$arr) { echo "[ ]\n"; return; }
    foreach ($arr as $v) { if (is_array($v)) {$run_sub=true; break;} }
    if (isset($run_sub)) {
    $subs = function ($arr) {
    echo "[\n";
    foreach ($arr as $sub) {
    if (!$sub) { echo "[ ]\n"; return; }
    $s = is_int($sub[0]) ? "\t[${sub[0]}": "\t['${sub[0]}'"; unset($sub[0]);
    foreach($sub as$v) $s = is_int($v) ? "$s, $v" : "$s, '$v'";
    echo "$s],\n";
    }
    echo "]\n";
    };
    return $subs($arr);
    }
    $s = is_int($arr[0]) ? "[${arr[0]}": "['${arr[0]}'"; unset($arr[0]);
    foreach($arr as$v) $s = is_int($v) ? "$s,$v" : "$s,'$v'";
    echo "$s]\n";
    if (!$arr) { echo "[ ]\n"; return; }
    foreach ($arr as $v) { if (is_array($v)) {$run_sub=true; break;} }
    if (isset($run_sub)) {
    $subs = function ($arr) {
    echo "[\n";
    foreach ($arr as $sub) {
    if (!$sub) { echo "[ ]\n"; return; }
    $s = is_int($sub[0]) ? "\t[${sub[0]}": "\t['${sub[0]}'"; unset($sub[0]);
    foreach($sub as$v) $s = is_int($v) ? "$s, $v" : "$s, '$v'";
    echo "$s],\n";
    }
    echo "]\n";
    };
    return $subs($arr);
    }
    $s = is_int($arr[0]) ? "[${arr[0]}": "['${arr[0]}'"; unset($arr[0]);
    foreach($arr as$v) $s = is_int($v) ? "$s,$v" : "$s,'$v'";
    echo "$s]\n";
    }

  2. Jeff-Russ revised this gist Feb 18, 2017. 1 changed file with 67 additions and 66 deletions.
    133 changes: 67 additions & 66 deletions recursive_search.php
    Original file line number Diff line number Diff line change
    @@ -1,81 +1,82 @@
    <?php
    function deep_search($val, $arr, $mode=1, $strict=true)
    function recursive_search($val, $arr, $mode=1, $strict=true)
    {
    $depth = ($depth=(int)$mode) ? $depth : 0;
    if (strpos($mode, 'all')!==false) {
    $r = function ($val, $a, $d, $s, $l=0, &$path=[], &$keys=[], &$i=0) use (&$r) {
    foreach($a as $k=>$v) {
    $path[] = $k;
    if (!$s && $v==$val || $v===$val) $keys[$i++] = $path;
    elseif ($l<$d && (is_array($v) /*|| method_exists($v,'getIterator')*/))
    $r($val, $v ,$d, $s, $l, $path, $keys, $i);
    array_pop($path);
    }
    if ($l!==0) return $keys ? $keys : false;
    return array_values( $keys );
    };
    } else {
    $r = function ($val, $a, $d, $s, $l=0, $keys=array()) use (&$r) {
    foreach($a as $k=>$v) {
    if (!$s && $v==$val || $v===$val) { $keys[]=$k; return $keys; }
    elseif ($l<$d && (is_array($v) /*|| method_exists($v,'getIterator')*/)) {
    $keys[]=$k;
    if ($keys=$r($val, $v ,$d, $s, $l+1, $keys)) return $keys;
    }
    }
    return false;
    };
    }
    return $r($val, $arr, $depth, $strict);
    $depth = ($depth=(int)$mode) ? $depth : 0;
    if (strpos($mode, 'all')!==false) {
    $r = function ($val, $a, $d, $s, $l=0, &$path=[], &$keys=[], &$i=0) use (&$r) {
    foreach($a as $k=>$v) {
    $path[] = $k;
    if (!$s && $v==$val || $v===$val) $keys[$i++] = $path;
    elseif ($l<$d && (is_array($v) /*|| method_exists($v,'getIterator')*/))
    $r($val, $v ,$d, $s, $l, $path, $keys, $i);
    array_pop($path);
    }
    if ($l!==0) return $keys ? $keys : false;
    return array_values( $keys );
    };
    } else {
    $r = function ($val, $a, $d, $s, $l=0, $keys=array()) use (&$r) {
    foreach($a as $k=>$v) {
    if (!$s && $v==$val || $v===$val) { $keys[]=$k; return $keys; }
    elseif ($l<$d && (is_array($v) /*|| method_exists($v,'getIterator')*/)) {
    $keys[]=$k;
    if ($keys=$r($val, $v ,$d, $s, $l+1, $keys)) return $keys;
    }
    }
    return false;
    };
    }
    return $r($val, $arr, $depth, $strict);
    }

    $arr = array(
    0=>array(1=>array(2=>'depth2') ),
    '1.4' => 0,
    'depth1'=>array('depth1'),
    'arr1'=>array(
    'arr2'=>array(
    'arr3'=>array('findme'),
    ),
    ),
    'findme1'=>array('findme'),
    0=>array(1=>array(2=>'depth2') ),
    '1.4' => 0,
    'depth1'=>array('depth1'),
    'arr1'=>array(
    'arr2'=>array(
    'arr3'=>array('findme'),
    ),
    ),
    'findme1'=>array('findme'),
    );
    print_vals(deep_search('depth1', $arr)); # ['depth1', 0]
    print_vals(deep_search('depth1', $arr, 0)); # [ ]
    print_vals(deep_search('depth1', $arr, 0, false));# ['1.4'] beware! non-strict
    print_vals(deep_search('depth2', $arr)); # [ ] default depth is 1
    print_vals(deep_search('depth2', $arr, 2)); # [0,1,2] depth now 2
    print_vals(deep_search('findme', $arr, 3)); # ['arr1','arr2','arr3',0]
    print_vals(recursive_search('depth1', $arr)); # ['depth1', 0]
    print_vals(recursive_search('depth1', $arr, 0)); # [ ]
    print_vals(recursive_search('depth1', $arr, 0, false));# ['1.4'] beware! non-strict
    print_vals(recursive_search('depth2', $arr)); # [ ] default depth is 1
    print_vals(recursive_search('depth2', $arr, 2)); # [0,1,2] depth now 2
    print_vals(recursive_search('findme', $arr, 3)); # ['arr1','arr2','arr3',0]

    // note that the value 'findme' occured twice but we only caught one
    print_vals(deep_search('findme', $arr, '3 all')); # ['arr1','arr2','arr3',0]
    print_vals(recursive_search('findme', $arr, '3 all')); # ['arr1','arr2','arr3',0]
    /* a third argument containing 'all' and optionally starting with an int
    * will return an array of deep_search values:
    [
    ['arr1', 'arr2', 'arr3', 0],
    ['findme1', 0],
    ]
    * will return an array of recursive_search values:
    [
    ['arr1', 'arr2', 'arr3', 0],
    ['findme1', 0],
    ]
    */

    ////////////////////////////////////////////////////////////////////////////////
    // just to display demo:
    function print_vals($arr) {
    if (!$arr) { echo "[ ]\n"; return; }
    foreach ($arr as $v) { if (is_array($v)) {$run_sub=true; break;} }
    if (isset($run_sub)) {
    $subs = function ($arr) {
    echo "[\n";
    foreach ($arr as $sub) {
    if (!$sub) { echo "[ ]\n"; return; }
    $s = is_int($sub[0]) ? "\t[${sub[0]}": "\t['${sub[0]}'"; unset($sub[0]);
    foreach($sub as$v) $s = is_int($v) ? "$s, $v" : "$s, '$v'";
    echo "$s],\n";
    }
    echo "]\n";
    };
    return $subs($arr);
    }
    $s = is_int($arr[0]) ? "[${arr[0]}": "['${arr[0]}'"; unset($arr[0]);
    foreach($arr as$v) $s = is_int($v) ? "$s,$v" : "$s,'$v'";
    echo "$s]\n";
    if (!$arr) { echo "[ ]\n"; return; }
    foreach ($arr as $v) { if (is_array($v)) {$run_sub=true; break;} }
    if (isset($run_sub)) {
    $subs = function ($arr) {
    echo "[\n";
    foreach ($arr as $sub) {
    if (!$sub) { echo "[ ]\n"; return; }
    $s = is_int($sub[0]) ? "\t[${sub[0]}": "\t['${sub[0]}'"; unset($sub[0]);
    foreach($sub as$v) $s = is_int($v) ? "$s, $v" : "$s, '$v'";
    echo "$s],\n";
    }
    echo "]\n";
    };
    return $subs($arr);
    }
    $s = is_int($arr[0]) ? "[${arr[0]}": "['${arr[0]}'"; unset($arr[0]);
    foreach($arr as$v) $s = is_int($v) ? "$s,$v" : "$s,'$v'";
    echo "$s]\n";
    }

  3. Jeff-Russ revised this gist Feb 18, 2017. 1 changed file with 60 additions and 15 deletions.
    75 changes: 60 additions & 15 deletions recursive_search.php
    Original file line number Diff line number Diff line change
    @@ -1,14 +1,32 @@
    <?php
    function recursive_search($val, $arr, $recurse=1, $strict=true, $d=0, $keys=array())
    function deep_search($val, $arr, $mode=1, $strict=true)
    {
    foreach($arr as $k=>$v) {
    if (!$strict && $v==$val || $v===$val) { $keys[] = $k; return $keys; }
    elseif ($d<$recurse&& (is_array($v)||method_exists($v,'getIterator')) ) {
    $keys[] = $k;
    if ($keys=recursive_search($val,$v,$recurse,$strict,$d+1,$keys))return $keys;
    }
    }
    return array();
    $depth = ($depth=(int)$mode) ? $depth : 0;
    if (strpos($mode, 'all')!==false) {
    $r = function ($val, $a, $d, $s, $l=0, &$path=[], &$keys=[], &$i=0) use (&$r) {
    foreach($a as $k=>$v) {
    $path[] = $k;
    if (!$s && $v==$val || $v===$val) $keys[$i++] = $path;
    elseif ($l<$d && (is_array($v) /*|| method_exists($v,'getIterator')*/))
    $r($val, $v ,$d, $s, $l, $path, $keys, $i);
    array_pop($path);
    }
    if ($l!==0) return $keys ? $keys : false;
    return array_values( $keys );
    };
    } else {
    $r = function ($val, $a, $d, $s, $l=0, $keys=array()) use (&$r) {
    foreach($a as $k=>$v) {
    if (!$s && $v==$val || $v===$val) { $keys[]=$k; return $keys; }
    elseif ($l<$d && (is_array($v) /*|| method_exists($v,'getIterator')*/)) {
    $keys[]=$k;
    if ($keys=$r($val, $v ,$d, $s, $l+1, $keys)) return $keys;
    }
    }
    return false;
    };
    }
    return $r($val, $arr, $depth, $strict);
    }

    $arr = array(
    @@ -20,17 +38,44 @@ function recursive_search($val, $arr, $recurse=1, $strict=true, $d=0, $keys=arra
    'arr3'=>array('findme'),
    ),
    ),
    'findme1'=>array('findme'),
    );
    print_vals(deep_search('depth1', $arr)); # ['depth1', 0]
    print_vals(deep_search('depth1', $arr, 0)); # [ ]
    print_vals(deep_search('depth1', $arr, 0, false));# ['1.4'] beware! non-strict
    print_vals(deep_search('depth2', $arr)); # [ ] default depth is 1
    print_vals(deep_search('depth2', $arr, 2)); # [0,1,2] depth now 2
    print_vals(deep_search('findme', $arr, 3)); # ['arr1','arr2','arr3',0]

    // note that the value 'findme' occured twice but we only caught one
    print_vals(deep_search('findme', $arr, '3 all')); # ['arr1','arr2','arr3',0]
    /* a third argument containing 'all' and optionally starting with an int
    * will return an array of deep_search values:
    [
    ['arr1', 'arr2', 'arr3', 0],
    ['findme1', 0],
    ]
    */

    ////////////////////////////////////////////////////////////////////////////////
    // just to display demo:
    function print_vals($arr) {
    if (!$arr) { echo "[ ]\n"; return; }
    foreach ($arr as $v) { if (is_array($v)) {$run_sub=true; break;} }
    if (isset($run_sub)) {
    $subs = function ($arr) {
    echo "[\n";
    foreach ($arr as $sub) {
    if (!$sub) { echo "[ ]\n"; return; }
    $s = is_int($sub[0]) ? "\t[${sub[0]}": "\t['${sub[0]}'"; unset($sub[0]);
    foreach($sub as$v) $s = is_int($v) ? "$s, $v" : "$s, '$v'";
    echo "$s],\n";
    }
    echo "]\n";
    };
    return $subs($arr);
    }
    $s = is_int($arr[0]) ? "[${arr[0]}": "['${arr[0]}'"; unset($arr[0]);
    foreach($arr as$v) $s = is_int($v) ? "$s,$v" : "$s,'$v'";
    echo "$s]\n";
    }
    print_vals(recursive_search('depth1', $arr)); # ['depth1', 0]
    print_vals(recursive_search('depth1', $arr, 0)); # [ ]
    print_vals(recursive_search('depth1', $arr, 0, false));# ['1.4'] beware! non-strict
    print_vals(recursive_search('depth2', $arr)); # [ ] default depth is 1
    print_vals(recursive_search('depth2', $arr, 2)); # [0,1,2] depth now 2
    print_vals(recursive_search('findme', $arr, 3)); # ['arr1','arr2','arr3',0]
  4. Jeff-Russ revised this gist Feb 16, 2017. 1 changed file with 1 addition and 0 deletions.
    1 change: 1 addition & 0 deletions recursive_search.php
    Original file line number Diff line number Diff line change
    @@ -1,3 +1,4 @@
    <?php
    function recursive_search($val, $arr, $recurse=1, $strict=true, $d=0, $keys=array())
    {
    foreach($arr as $k=>$v) {
  5. Jeff-Russ created this gist Feb 16, 2017.
    35 changes: 35 additions & 0 deletions recursive_search.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,35 @@
    function recursive_search($val, $arr, $recurse=1, $strict=true, $d=0, $keys=array())
    {
    foreach($arr as $k=>$v) {
    if (!$strict && $v==$val || $v===$val) { $keys[] = $k; return $keys; }
    elseif ($d<$recurse&& (is_array($v)||method_exists($v,'getIterator')) ) {
    $keys[] = $k;
    if ($keys=recursive_search($val,$v,$recurse,$strict,$d+1,$keys))return $keys;
    }
    }
    return array();
    }

    $arr = array(
    0=>array(1=>array(2=>'depth2') ),
    '1.4' => 0,
    'depth1'=>array('depth1'),
    'arr1'=>array(
    'arr2'=>array(
    'arr3'=>array('findme'),
    ),
    ),
    );

    function print_vals($arr) {
    if (!$arr) { echo "[ ]\n"; return; }
    $s = is_int($arr[0]) ? "[${arr[0]}": "['${arr[0]}'"; unset($arr[0]);
    foreach($arr as$v) $s = is_int($v) ? "$s,$v" : "$s,'$v'";
    echo "$s]\n";
    }
    print_vals(recursive_search('depth1', $arr)); # ['depth1', 0]
    print_vals(recursive_search('depth1', $arr, 0)); # [ ]
    print_vals(recursive_search('depth1', $arr, 0, false));# ['1.4'] beware! non-strict
    print_vals(recursive_search('depth2', $arr)); # [ ] default depth is 1
    print_vals(recursive_search('depth2', $arr, 2)); # [0,1,2] depth now 2
    print_vals(recursive_search('findme', $arr, 3)); # ['arr1','arr2','arr3',0]