Intereting Posts

Многомерный ассоциативный массив PHP array_push для поддержания структуры

У меня есть массив:

$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); 

но, очевидно, это невозможно. Есть идеи? Даже если это просто какая функция массива мне нужна.

Related of "Многомерный ассоциативный массив PHP array_push для поддержания структуры"

Несколько более эффективный метод для вашего поиска, используя основные функции 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;