PHP array_push многомерный ассоциативный массив для поддержки структуры - PullRequest
1 голос
/ 27 апреля 2011

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

 $array= array(
        'Book1' => array('http://www.google.com', '45' ),
        'Book2' => array('http://www.yahoo.com', '46',
        'Book3' => array('http://www.excite.com', '47', )

и я пытаюсь написать функцию, в которой вы можете искать и возвращать массив с неизменными значениями $ keys и $ values. Так что, если кто-то будет искать «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);

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

Ответы [ 2 ]

2 голосов
/ 27 апреля 2011

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

РЕДАКТИРОВАТЬ 2

Использование strcasecmp () также может значительно облегчить сравнение определяемых пользователем ключей.

function key_compare_func($key1, $key2) {
    return strcasecmp($key1,$key2);
}
0 голосов
/ 27 апреля 2011

Вместо этого используйте эту логику (хотя я не на 100% хочу, чтобы вы делали последнюю строку?)

$BookArray[]=$key;
$bookDetailsarray[]=$value;
$bookArray[]=$bookDetailsarray;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...