递归 array_search
Recursive array_search
我有一个多维数组:
$categories = array(
array(
'CategoryID' => 14308,
'CategoryLevel' => 1,
'CategoryName' => 'Alcohol & Food',
'CategoryParentID' => 14308
),
// CHILD CATEGORIES
array(
array(
'CategoryID' => 179836,
'CategoryLevel' => 2,
'CategoryName' => 'Alcohol & Alcohol Mixes',
'CategoryParentID' => 14308
),
array(
array(
'CategoryID' => 172528,
'CategoryLevel' => 2,
'CategoryName' => 'Antipasto, Savoury',
'CategoryParentID' => 14308
)
)
)
);
我需要获取索引的确切位置,并且由于 array_search
不适用于多维数组,我正在使用 PHP 手册中提供的函数之一页。
function recursive_array_search($needle,$haystack) {
foreach($haystack as $key=>$value) {
$current_key=$key;
if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
return $current_key;
}
}
return false;
}
.. 但它也是 returns 第一个数组的键:
echo recursive_array_search(172528, $categories); // outputs 1
我期待:
[1][1][0]
您可以像这样更改您的递归函数,这应该会给您解决方案:
function recursive_array_search($needle, $haystack, $currentKey = '') {
foreach($haystack as $key=>$value) {
if (is_array($value)) {
$nextKey = recursive_array_search($needle,$value, $currentKey . '[' . $key . ']');
if ($nextKey) {
return $nextKey;
}
}
else if($value==$needle) {
return is_numeric($key) ? $currentKey . '[' .$key . ']' : $currentKey . '["' .$key . '"]';
}
}
return false;
}
这将导致
[1][1][0]["CategoryID"]
因为 CategoryID 也是多维数组中的一个键。
如果你不想这样,你可以将函数适配为
function recursive_array_search($needle, $haystack, $currentKey = '') {
foreach($haystack as $key=>$value) {
if (is_array($value)) {
$nextKey = recursive_array_search($needle,$value, $currentKey . '[' . $key . ']');
if ($nextKey) {
return $nextKey;
}
}
else if($value==$needle) {
return is_numeric($key) ? $currentKey . '[' .$key . ']' : $currentKey;
}
}
return false;
}
您忽略了对 recursive_array_search
的内部调用的返回值。不要那样做。
/*
* Searches for $needle in the multidimensional array $haystack.
*
* @param mixed $needle The item to search for
* @param array $haystack The array to search
* @return array|bool The indices of $needle in $haystack across the
* various dimensions. FALSE if $needle was not found.
*/
function recursive_array_search($needle,$haystack) {
foreach($haystack as $key=>$value) {
if($needle===$value) {
return array($key);
} else if (is_array($value) && $subkey = recursive_array_search($needle,$value)) {
array_unshift($subkey, $key);
return $subkey;
}
}
}
public static function unique(array $data, $key){
$rez = [];
foreach($data as $val){
if(!isset($val[$key]) && is_array($val)){
return self::unique($val, $key);
}elseif( isset($val[$key]) ){
$rez[] = $val[$key];
}
}
return array_unique($rez);
}
function array_search_recursive( $search, $values = array(), $i = 0) {
$match = false;
var_dump($i, $search);
$i++;
foreach ( $values as $keyState => $val ) {
var_dump($val == $search, 'expression');
if ( $val == $search ) {
return $keyState;
}
if ( is_array( $val ) ) {
$match = array_search_recursive($search, $val, $i);
}
if ( $match !== false ) {
return $keyState;
}
}
return false;
}
echo array_search_recursive($search, $canada)
编辑:
这将 return 第一个键,已针对 $canada = array( 'Brazilia' => 'test1', "Alberta" => [ "Airdrie", "Brooks", "Camrose" ], "British Columbia" => [ "Abbotsford" => [ 'a', 'b', 'c' ], "Armstrong", "Castlegar" ], "Manitoba" => [ "Brandon", "Selkirk" ], 'Olanda' => 'test2' ); $search = "Selkirk";
进行测试
我有一个多维数组:
$categories = array(
array(
'CategoryID' => 14308,
'CategoryLevel' => 1,
'CategoryName' => 'Alcohol & Food',
'CategoryParentID' => 14308
),
// CHILD CATEGORIES
array(
array(
'CategoryID' => 179836,
'CategoryLevel' => 2,
'CategoryName' => 'Alcohol & Alcohol Mixes',
'CategoryParentID' => 14308
),
array(
array(
'CategoryID' => 172528,
'CategoryLevel' => 2,
'CategoryName' => 'Antipasto, Savoury',
'CategoryParentID' => 14308
)
)
)
);
我需要获取索引的确切位置,并且由于 array_search
不适用于多维数组,我正在使用 PHP 手册中提供的函数之一页。
function recursive_array_search($needle,$haystack) {
foreach($haystack as $key=>$value) {
$current_key=$key;
if($needle===$value OR (is_array($value) && recursive_array_search($needle,$value) !== false)) {
return $current_key;
}
}
return false;
}
.. 但它也是 returns 第一个数组的键:
echo recursive_array_search(172528, $categories); // outputs 1
我期待:
[1][1][0]
您可以像这样更改您的递归函数,这应该会给您解决方案:
function recursive_array_search($needle, $haystack, $currentKey = '') {
foreach($haystack as $key=>$value) {
if (is_array($value)) {
$nextKey = recursive_array_search($needle,$value, $currentKey . '[' . $key . ']');
if ($nextKey) {
return $nextKey;
}
}
else if($value==$needle) {
return is_numeric($key) ? $currentKey . '[' .$key . ']' : $currentKey . '["' .$key . '"]';
}
}
return false;
}
这将导致
[1][1][0]["CategoryID"]
因为 CategoryID 也是多维数组中的一个键。
如果你不想这样,你可以将函数适配为
function recursive_array_search($needle, $haystack, $currentKey = '') {
foreach($haystack as $key=>$value) {
if (is_array($value)) {
$nextKey = recursive_array_search($needle,$value, $currentKey . '[' . $key . ']');
if ($nextKey) {
return $nextKey;
}
}
else if($value==$needle) {
return is_numeric($key) ? $currentKey . '[' .$key . ']' : $currentKey;
}
}
return false;
}
您忽略了对 recursive_array_search
的内部调用的返回值。不要那样做。
/*
* Searches for $needle in the multidimensional array $haystack.
*
* @param mixed $needle The item to search for
* @param array $haystack The array to search
* @return array|bool The indices of $needle in $haystack across the
* various dimensions. FALSE if $needle was not found.
*/
function recursive_array_search($needle,$haystack) {
foreach($haystack as $key=>$value) {
if($needle===$value) {
return array($key);
} else if (is_array($value) && $subkey = recursive_array_search($needle,$value)) {
array_unshift($subkey, $key);
return $subkey;
}
}
}
public static function unique(array $data, $key){
$rez = [];
foreach($data as $val){
if(!isset($val[$key]) && is_array($val)){
return self::unique($val, $key);
}elseif( isset($val[$key]) ){
$rez[] = $val[$key];
}
}
return array_unique($rez);
}
function array_search_recursive( $search, $values = array(), $i = 0) {
$match = false;
var_dump($i, $search);
$i++;
foreach ( $values as $keyState => $val ) {
var_dump($val == $search, 'expression');
if ( $val == $search ) {
return $keyState;
}
if ( is_array( $val ) ) {
$match = array_search_recursive($search, $val, $i);
}
if ( $match !== false ) {
return $keyState;
}
}
return false;
}
echo array_search_recursive($search, $canada)
编辑:
这将 return 第一个键,已针对 $canada = array( 'Brazilia' => 'test1', "Alberta" => [ "Airdrie", "Brooks", "Camrose" ], "British Columbia" => [ "Abbotsford" => [ 'a', 'b', 'c' ], "Armstrong", "Castlegar" ], "Manitoba" => [ "Brandon", "Selkirk" ], 'Olanda' => 'test2' ); $search = "Selkirk";