Как искать по ключу = > значению в многомерном массиве в PHP

Для добавления новой строки используйте

document.write("<br>")

. Для добавления использования пространства

document.write("&nbsp;")

или

document.write("\n")
141
задан 19 June 2009 в 17:19
поделиться

4 ответа

Код:

function search($array, $key, $value)
{
    $results = array();

    if (is_array($array)) {
        if (isset($array[$key]) && $array[$key] == $value) {
            $results[] = $array;
        }

        foreach ($array as $subarray) {
            $results = array_merge($results, search($subarray, $key, $value));
        }
    }

    return $results;
}

$arr = array(0 => array(id=>1,name=>"cat 1"),
             1 => array(id=>2,name=>"cat 2"),
             2 => array(id=>3,name=>"cat 1"));

print_r(search($arr, 'name', 'cat 1'));

Вывод:

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => cat 1
        )

    [1] => Array
        (
            [id] => 3
            [name] => cat 1
        )

)

Если эффективность важна, вы можете написать это так, чтобы все рекурсивные вызовы сохраняли свои результаты в одном временном массиве $ results , а чем объединение массивов вместе, например:

function search($array, $key, $value)
{
    $results = array();
    search_r($array, $key, $value, $results);
    return $results;
}

function search_r($array, $key, $value, &$results)
{
    if (!is_array($array)) {
        return;
    }

    if (isset($array[$key]) && $array[$key] == $value) {
        $results[] = $array;
    }

    foreach ($array as $subarray) {
        search_r($subarray, $key, $value, $results);
    }
}

Ключ здесь в том, что search_r принимает свой четвертый параметр по ссылке, а не по значению; амперсанд и имеет решающее значение.

К вашему сведению: если у вас более старая версия PHP, вы должны указать часть передачи по ссылке в вызове на search_r , а не в его объявлении. То есть последняя строка становится search_r ($ subarray, $ key, $ value, & $ results) .

203
ответ дан 23 November 2019 в 22:58
поделиться

Как насчет версии SPL ? Это избавит вас от необходимости печатать:

// I changed your input example to make it harder and
// to show it works at lower depths:

$arr = array(0 => array('id'=>1,'name'=>"cat 1"),
             1 => array(array('id'=>3,'name'=>"cat 1")),
             2 => array('id'=>2,'name'=>"cat 2")
);

//here's the code:

    $arrIt = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr));

 foreach ($arrIt as $sub) {
    $subArray = $arrIt->getSubIterator();
    if ($subArray['name'] === 'cat 1') {
        $outputArray[] = iterator_to_array($subArray);
    }
}

Что замечательно, в основном тот же код будет проходить итерацию по каталогу за вас, используя RecursiveDirectoryIterator вместо RecursiveArrayIterator. SPL - это roxor.

Единственное разочарование в SPL - это то, что он плохо документирован в сети. Но несколько книг по PHP содержат некоторые полезные детали, в частности Pro PHP; и, возможно, вы также можете найти в Google дополнительную информацию.

70
ответ дан 23 November 2019 в 22:58
поделиться

Мне нужно было что-то подобное, но для поиска многомерного массива по значению ... Я взял пример Джона и написал

function _search_array_by_value($array, $value) {
        $results = array();
        if (is_array($array)) {
            $found = array_search($value,$array);
            if ($found) {
                $results[] = $found;
            }
            foreach ($array as $subarray)
                $results = array_merge($results, $this->_search_array_by_value($subarray, $value));
        }
        return $results;
    }

Надеюсь, это кому-то поможет :)

2
ответ дан 23 November 2019 в 22:58
поделиться
if (isset($array[$key]) && $array[$key] == $value)

Незначительное улучшение быстрой версии.

14
ответ дан 23 November 2019 в 22:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: