У меня есть массив:
$array= array( 'Book1' => array('http://www.google.com', '45' ), 'Book2' => array('http://www.yahoo.com', '46', 'Book3' => array('http://www.excite.com', '47', )
и я пытаюсь написать функцию, в которой вы можете искать и возвращать массив с неизменными значениями $ keys и $. Поэтому, если кто-то ищет «Book1», «Book2», тогда они вернут массив:
$results = array( 'Book1' => array('http://www.google.com', '45' ), 'Book2' => array('http://www.yahoo.com', '46',))
Эта:
$bookArray = array() $bookDetailsarray = array(); $needles = array('book1' , 'book2' ); foreach ($needles as $needle) { foreach ($array as $key => $value) { if ($key == $needle) { array_push($BookArray, $key); array_push($bookDetailsarray, $value); array_push($bookArray, $bookDetailsarray); } } } }
Это работает, но на каждой итерации foreach он продолжает добавлять $ bookDetailsaray к значению $. Поэтому он возвращает:
Book1 => [0]'Book1details' Book2 => [0]'Book1details' [1]'Book2details' Book3 => [0]'Book1details' [1]'Book2details' [2] 'Book3details'
и так далее.
Я хочу иметь возможность:
array_push($BookArray, $key=>$value);
но, очевидно, это невозможно. Есть идеи? Даже если это просто какая функция массива мне нужна.
Несколько более эффективный метод для вашего поиска, используя основные функции PHP, а не цикл:
$searchArray = array( 'Book1' => array('http://www.google.com', '45' ), 'Book2' => array('http://www.yahoo.com', '46'), 'Book3' => array('http://www.excite.com', '47' ) ); $needles = array('Book1','Book3'); $searchResults = array_intersect_key($searchArray,array_flip($needles)); var_dump($searchResults);
Но учтите, что он чувствителен к регистру
РЕДАКТИРОВАТЬ
Если вам нужен поиск без учета регистра, вы можете использовать array_intersect_ukey () вместо этого, используя пользовательское сравнение, чтобы игнорировать случай с ключами.
function key_compare_func($key1, $key2) { $key1 = strtoupper($key1); $key2 = strtoupper($key2); if ($key1 == $key2) return 0; else if ($key1) > $key2) return 1; else return -1; } $searchResults = array_intersect_ukey($searchArray, array_flip($needles), 'key_compare_func');
EDIT 2
Использование strcasecmp () может значительно упростить сопоставление пользовательских ключей.
function key_compare_func($key1, $key2) { return strcasecmp($key1,$key2); }
Используйте эту логику (хотя, я не на 100%, что вы хотите, чтобы последняя строка делала?)
$BookArray[]=$key; $bookDetailsarray[]=$value; $bookArray[]=$bookDetailsarray;