Для добавления новой строки используйте
document.write("<br>")
. Для добавления использования пространства
document.write(" ")
или
document.write("\n")
Код:
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)
.
Как насчет версии 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 дополнительную информацию.
Мне нужно было что-то подобное, но для поиска многомерного массива по значению ... Я взял пример Джона и написал
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;
}
Надеюсь, это кому-то поможет :)
if (isset($array[$key]) && $array[$key] == $value)
Незначительное улучшение быстрой версии.