Найти последний массив из многомерного массива и получить индекс - PullRequest
0 голосов
/ 16 января 2020

Я работаю над многомерными массивами и нахожу случаи, подобные этому вопросу . После того, как я попытался, выяснилось, что мне нужно было искать идентификатор и уникальное значение, поэтому оно отличалось от моего случая.

, поэтому мой случай выглядит так: у меня есть многомерный массив, подобный этому:

Array
(
    [0] => Array
        (
            [item] => null
            [count] => 0
            [child] => Array
                (
                    [Dagadu Bocah] => Array
                        (
                            [item] => Dagadu Bocah
                            [count] => 47
                            [child] => Array
                                (
                                    [HirukPikuk] => Array
                                        (
                                            [item] => HirukPikuk
                                            [count] => 5
                                            [child] => Array
                                                (
                                                    [DGD] => Array
                                                        (
                                                            [item] => DGD
                                                            [count] => 1
                                                            [child] => 
                                                        )

                                                )

                                        )

                                    [DGD] => Array
                                        (
                                            [item] => DGD
                                            [count] => 5
                                            [child] => Array
                                                (
                                                    [Malioboroman] => Array
                                                        (
                                                            [item] => Malioboroman
                                                            [count] => 1
                                                            [child] => 
                                                        )

                                                )

                                        )

                                    [Malioboroman] => Array
                                        (
                                            [item] => Malioboroman
                                            [count] => 2
                                            [child] => 
                                        )

                                )

                        )

я ищу, как искать массивы, например, «DGD» будет производить все индексы, заканчивающиеся массивом «DGD»

DGD => Dagadu Bocah->HirukPikuk,
       Dagadu Bocah;
Malioboroman=> Dagadu Bocah->DGD,
       Dagadu Bocah;

, что я пробовал это, с конечным результатом, используя implode:

public function searchRec($haystack, $needle, $pathId=Array(), $pathIndex=Array())
{
  foreach($haystack as $index => $item) {
    $pathId[] = $item['count'];
    $pathIndex[] = $index;
    if($item['item'] == $needle) {
        $returnObject = new stdClass();
        $returnObject->match = $item;   
        $returnObject->pathId = $pathId; 
        $returnObject->pathIndex = $pathIndex; 
        return $returnObject;
    }

    if(isset($item['child']) && count($item['child']>0)) {
        $result =searchRec($item['child'], $needle, $pathId, $pathIndex);
        if($result) {
            return $result;
        }
    }
}
return false;
}
$result = searchRec($Array, "Some Text2");
echo implode(" -> ", $result->pathId);

1 Ответ

0 голосов
/ 16 января 2020

Не уверен, что это то, что вы ищете, но это может помочь вам решить ваши проблемы.

Функция pathFinder() является рекурсивной функцией, то есть она будет вызывать себя столько раз, сколько необходимо для обхода вашего предметного массива.

Просто установите needle, то есть key вы ищите, и он возвращает все пути к ключу в вашем предметном массиве.

Пример его использования:

У нас есть массив $arr с три клавиши с именем one, мы собираемся использовать функцию для поиска путей ко всем трем клавишам:

<code>$arr = [
    ['one' => 'once', 
     'two' => ['one' => 'twice', 'two' => 'twice', ['one' => 'thrice']], 
     'three' => 'once',]
];

$needle = 'one'; // the key we're looking for
$result = pathFinder($arr, $needle); // invoke function

/**
 * function pathFinder() returns the path(s) to a key in an array.
 *
 * @param array  $arr    the subject array
 * @param string $needle the key we're looking for
 *
 * @return array            the paths leading to the key we're looking for
 */
function pathFinder(array $arr = [], $needle = ''): array
{
    static $path = '';
    static $paths = [];

    foreach ($arr as $key => $value) {
        if (is_array($value)) {
            $path .= $key . "->";
            pathFinder($value, $needle);
        } else {
            if ($key === $needle) {
                $paths[] = $path . $key; // store path
            }
        }
    }
    return $paths; // return all found paths to key $needle
}

echo '<pre>';
print_r($result);
echo '
';

выход:

Array
(
    [0] => 0->one
    [1] => 0->two->one
    [2] => 0->two->0->one
)

рабочий демо

...