Обход массива — Как получить значение первого вхождения array_walk_recursive в переполнении стека

У меня есть глубокий многомерный массив, который мне нужен для извлечения значения конкретного ключа. Я обнаружил, что array_walk_recursive функция будет моим лучшим вариантом. Мне нужно только первое вхождение.

Мой массив выглядит так — (кроме гораздо более сложного)

Array (
[vehicle info] => Array (
[one] => Array (
[submodel] => LX
[engine] => 2.3
)
[two] => Array (
[color] => blue
[year] => 2007
[wheels] => 4
)
[three] => Array (
[submodel] => LX
[make] => Ford
[model] => F-150
[offroad] => No
)
)
)

Проблема здесь в том, submodel в обоих и три. Кроме того, массив не соответствует, поэтому я должен использовать array_walk_recursive найти в нем соответствующий ключ, а затем вернуть значение этого ключа.

Вот мой текущий код —

array_walk_recursive ($array, (function ($item, $key) {
$wanted = "submodel";
if ($key === $wanted) {
echo ("$key is $item");
}
}));

Вышеуказанный возврат submodel is LXsubmodel is LX,

Бонусный вопрос !!
Как я могу найти несколько ключей и вернуть первое соответствующее значение для каждого из них? Я думал поместить все нужные ключи в массив, затем выполнить цикл foreach, но не знаю, как это структурировать. Я новичок в php.

2

Решение

Код:

$array=['vehicle info'=>[
'one'=>['submodel'=>'LX','engine'=>2.3],
'two'=>['color'=>'blue','year'=>2007,'wheels'=>4],
'three'=>['submodel'=>'LX','make'=>'Ford','model'=>'F-150','offroad'=>'No']
]
];

$find=['submodel','offroad'];

array_walk_recursive($array,function($v,$k)use($find,&$result){
if(in_array($k,$find) && !isset($result[$k])){
$result[$k]="$k is $v";
}
});
var_export($result);

Выход:

array (
'submodel' => 'submodel is LX',
'offroad' => 'offroad is No',
)
2

Другие решения

Я бы начал с установки значений, которые вы хотите nullи затем сохранит их, только если они еще не найдены, проверив is_null(), Я не тестировал этот код, но он должен выглядеть примерно так:

$submodel = null;
array_walk_recursive ($array, (function ($item, $key) {
$wanted = "submodel";
if ($key === $wanted && is_null($submodel)) {
echo ("$key is $item");
$submodel = $item;
}
}));
2

Функция array_walk_recursive () не позволяет возвращать результаты сопоставления, однако в PHP 7 вы можете использовать анонимную функцию и переменную для хранения значения сопоставления.

$matching = null;
$wanted = "submodel";

array_walk_recursive ($array, function ($item, $key) use ($wanted, $matching) {
if (($key === $wanted) && is_null($matching)) {
$matching = $item;
}
});
2

Поскольку нет возможности вернуться рано из array_walk_recursive()Я бы предложил создать функцию, чтобы найти первое вхождение $wanted:

$arr = [
'vehicle info' => [
'one' => ['submodel' => 'LX', 'engine' => '2.3'],
'two' => ['color' => 'blue', 'year' => '2007', 'wheels' => '4'],
'three' => ['submodel' => 'LX', 'make' => 'Ford', 'model' => 'F-150', 'offroad' => 'No'],
],
];

function find($needle, $haystack, $found = '')
{
foreach ($haystack as $key => $value) {
if ($found) {
break;
}
if ($key === $needle) {
$found = "{$needle} is {$value}";
break;
}
if (is_array($value)) {
$found = find($needle, $value, $found);
}
}
return $found;
}

$wanted = 'submodel';
$result = find($wanted, $arr);

var_dump($result); // string(14) "submodel is LX"

Жить демонстрация


Обновить: для поиска нескольких ключей вам нужно сделать это в цикле:

$multiple_keys = array('submodel', 'year');

foreach ($multiple_keys as $wanted) {
var_dump(find($wanted, $arr));
}

// Output:
//    string(14) "submodel is LX"//    string(12) "year is 2007"

Жить демонстрация

2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector