Проверьте, соответствует ли ключ массива данным из запроса на выборку.

1

У меня многомерный массив. Ключи отдельных массивов - это текст. Я хотел бы знать, как сопоставить ключ с частью строки, которая из зацикленных данных SELECT.

Пример массива

Array ( [Volvo] => Array ( [0] => ) 
        [Ford] => Array ( [0] => ) 
        [Seat] => Array ( [0] => ) )

Итак, из этого массива $cars, как я мог бы сопоставлять данные, поступающие из моего запроса SELECT

Выберите Output echo $row['car'];

Volvo, Mercedes, Lexus

Что я после

если ключ одного из моих массивов соответствует части строки из моего запроса выбора, так как пример говорит выше, что Volvo будет соответствовать, тогда сделайте что-нибудь. Это что-то для меня добавляет больше данных в этот массив.

Я попытался вариация in_array, array_search и array_filter, но не нашел решение, которое работает для меня.

Пример обратного тому, что я делал через цикл foreach

    $searchword = $array_element;
$result = array_filter($cars, function($var) use ($searchword) { return preg_match("/\b$searchword\b/i", $var); });

взято из: Поиск элемента массива PHP, содержащего строку

  • 1
    Я попробовал варианты Просто покажите нам 1 попытку, и мы покажем вам, где вы застряли и как решить вашу проблему.
  • 1
    @Rizier123 Rizier123 я опубликовал изменения. Мне не понравился этот, так как он не работает с массивами MD, и я не хочу зацикливать каждый ключ массива по соображениям скорости. Все остальные варианты такие же, как и выше, бесполезны.
Показать ещё 1 комментарий
Теги:
arrays
multidimensional-array

3 ответа

1
Лучший ответ

Это должно сработать для вас:

Сначала я использовал preg_split() чтобы разбить строку поиска (Volvo, Mercedes, Lexus) на массив.

Регулярное выражение:

/\s*,\s*/

Просто означает:

  • \ s * соответствует любому символу пробела [\ r\n\t\f]
    • Квантификатор: * Между нулевым и неограниченным временем, как можно больше раз, отдавая по мере необходимости [жадный]
  • , соответствует символу, буквально
  • \ s * соответствует любому символу пробела [\ r\n\t\f]
    • Квантификатор: * Между нулевым и неограниченным временем, как можно больше раз, отдавая по мере необходимости [жадный]

Это гарантирует, что у нас нет пробелов в словах поиска из вашей строки. Таким образом, мы получим такой массив:

Array
(
    [0] => Volvo
    [1] => Mercedes
    [2] => Lexus
)

После этого я просто возьму array_intersect_key() из вашего массива и массив поиска, который мы только что создали.

Код:

<?php

    $arr = preg_split("/\s*,\s*/", $row["car"], -1, PREG_SPLIT_NO_EMPTY);

    if(($intersect = array_intersect_key($cars, array_flip($arr)))) {
        echo "Do stuff!";
        print_r($intersect);
    } else {
        echo "Drink a cup of tea";
    }

?>

вывод:

Array
(
    [Volvo] => Array
        (
            [0] => 
        )

)
  • 0
    Вы звезда! мне нужно было всего лишь сделать пару настроек, чтобы получить 100% того, что мне нужно, поэтому большое спасибо @ Rizier123
  • 0
    @Brobina Не за что.
1

Попробуйте использовать PHP stripos, это просто и эффективно:

Базовые данные:

$array = Array ( [Volvo] => Array ( [0] => ) 
        [Ford] => Array ( [0] => ) 
        [Seat] => Array ( [0] => ) )
;

SQL-данные (строка или массив):

$row['car']; // string
$row //array of all SQL columns output

Foreach с stripos:

    foreach($array as $rowKey=>$rowArray){
        $rowKey = trim($rowKey);
        foreach($row as $sqlRow=>$sqlArray){
            $sqlRow = trim($sqlRow);
            if (stripos($rowKey,$sqlRow) !== false){
               ///values are the same in this key in the array and in the SQL output
            }
         }
     unset($sqlRow,$sqlArray);
    }
unset($rowKey,$rowArray);

Это может быть не самым эффективным, но должно дать вам результат, который вы хотите

  • 0
    спасибо за вашу помощь Мартин
1

Есть много способов достижения вашей цели. Я бы использовал функцию explode() для разделения данных, полученных из базы данных ($row['car']) на куски и trim() чтобы убедиться, что идентифицированные части не имеют пробелов:

$brands = array_map('trim', explode(',', $row['car']));

Теперь print_r($brands) должен показать массив, значения которого являются ключами-кандидатами в вашем массиве примеров ($example ниже).

Далее это зависит от того, что вы хотите сопоставить, и как вы хотите обработать матчи.

Простую идентификацию можно выполнить с помощью array_intersect() с $brands и ключами массива example (см. Функцию array_keys()).

$common = array_intersect($brands, array_keys($example));
foreach ($common as $key) {
    // Do something with $example[$key]
}

Или вы можете перебирать напрямую через $brands и проверять, является ли значение ключом в $example:

foreach ($brands as $key) {
    if (array_key_exists($key, $example)) {
        // Do something with $example[$key]
    }
}

Вы можете использовать isset($example[$key]), а не array_key_exists($key, $example]).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню