PHP: поиск в первом «столбце» массива массивов - PullRequest
2 голосов
/ 01 марта 2011

У меня есть массив массивов, и я хочу скопировать первый столбец

Данные выглядят следующим образом:

(0=>"homer", 1=> 1, 2=> 2, 3=> 3)
(0 => "marge", 1=> 2, 2 => 4, 3=> 8)
(0 => "bart", 1 => 6, 2 => 2, 3 => 7)
(0 => "lisa", 1 => 16, 2 => 20, 3 => 71)

Есть ли функция PHP (похожая на array_search), которую яможно использовать для поиска соответствия имени в первом «столбце»?

Данные в первом столбце уже отсортированы, поэтому, если бы я мог скопировать «столбец1», я мог бы выполнить array_search (который я предполагаю используетbsearch, а не наивный элемент за итерацией элемента).

Мои вопросы:

  • Существует ли функция PHP, похожая на array_search, которую я могу использовать для поискадля сопоставления элементов в 1-м столбце 2D-массива?

  • Если это не так, есть ли функция PHP для копирования первого столбца в одномерный массив (при сохранении порядка), чтобы я мог вызватьмассив_поиск на нем?

Ответы [ 5 ]

6 голосов
/ 01 марта 2011

Существует ли функция PHP, похожая на array_search, которую я могу использовать для поиска подходящих элементов в 1-м столбце 2D-массива?

Вы можете использовать array_filter

$matchedArray = array_filter($myArray, function($x) use ($nameToSearchFor) {
    return $x[0] == $nameToSearchFor;
});

Тогда дано:

$myArray = array(
    array(0=>"homer", 1=> 1, 2=> 2, 3=> 3),
    array(0 => "marge", 1=> 2, 2 => 4, 3=> 8),
    array(0 => "bart", 1 => 6, 2 => 2, 3 => 7),
    array(0 => "lisa", 1 => 16, 2 => 20, 3 => 71),
);

$nameToSearchFor = "bart";

Произойдет:

 $matchedArray === array(0 => "bart", 1 => 6, 2 => 2, 3 => 7);

Я использовал замыкания , которые работают тольков PHP 5.3.0, но вы используете традиционный обратный вызов или create_function в старых версиях php

Если это не так, есть функция PHP для копирования первого столбца в 1Dмассив (при сохранении порядка), чтобы я мог вызвать для него array_search?

См. deceze первый вариант.Я не вижу необходимости повторять совершенно хороший ответ.

4 голосов
/ 01 марта 2011
$oneDarray = array_map(create_function('$a', 'return $a[0];'), $twoDarray);

Или:

foreach ($twoDarray as $values) {
    if ($values[0] == 'homer') {
        // found!
        break;
    }
}
0 голосов
/ 23 мая 2015

Этот вопрос занял первое место в моем поиске Google по запросу array search column.Мне потребовалось некоторое время, чтобы найти этот лучший ответ на тот же вопрос . По марке M .

Если вы используете PHP >= 5.5, то вы можете использовать новый array_column () ,>в сочетании с array_keys () и array_map () .

Применительно к этому вопросу, кпоиск "Барта", это будет:

$array=array(
    array(0=>"homer", 1=> 1, 2=> 2, 3=> 3),
    array(0 => "marge", 1=> 2, 2 => 4, 3=> 8),
    array(0 => "bart", 1 => 6, 2 => 2, 3 => 7),
    array(0 => "lisa", 1 => 16, 2 => 20, 3 => 71));

$result = $array[array_search("bart",array_column($array, 0))];
print_r($result);

/* Output:
    Array
    (
        [0] => bart
        [1] => 6
        [2] => 2
        [3] => 7
    )
*/

Демонстрация запуска

0 голосов
/ 01 марта 2011

Вы можете преобразовать массив для использования ключей, используя array_walk

$new_data = array();
array_walk($data, create_function('a','$new_data[$a[0]] = $a;'));
$search_text = 'bart';
if (array_key_exists($new_data, $search_text)) {
    echo "I found '$search_text': ".print_r($new_data[$search_text], true);
}
0 голосов
/ 01 марта 2011

PHP не имеет хорошего чистого способа сделать это, о котором я знаю.Однако вы можете сделать это самостоятельно, используя бинарный поиск, так как массив уже отсортирован по значениям в первом столбце его дочерних массивов.Вот код для этого:

<?php
// Binary Search Taken By greenmr:
// http://php.net/manual/en/function.array-search.php#89413
function array_bsearch( $needle, $haystack, $comparator ) {
    $high = Count( $haystack ) -1;
    $low = 0;

    while ( $high >= $low ){
        $probe = Floor( ( $high + $low ) / 2 );
        $comparison = $comparator( $haystack[$probe], $needle );
        if ( $comparison < 0 ) {
            $low = $probe +1;
        } elseif ( $comparison > 0 ) {
            $high = $probe -1;
        } else {
            return $probe;
        }
    }

  return -1;
}

// Compare the needle the first element/column 
function KeyCompare( $obj, $needle) {
    if ( $obj[0] < $needle ) {
        return -1;
    } elseif ( $obj[0] > $needle ) {
        return 1;
    } else {
        return 0;
    }
}

$arr = array(array(0=>"homer", 1=> 1, 2=> 2, 3=> 3),
        array(0 => "marge", 1=> 2, 2 => 4, 3=> 8),
        array(0 => "bart", 1 => 6, 2 => 2, 3 => 7),
        array(0 => "lisa", 1 => 16, 2 => 20, 3 => 71));

$index = array_bsearch( 'marge', $arr, 'KeyCompare' );

// prints the array containing marge
echo print_r($arr[$index]);
?>    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...