Как получить все ассоциативные массивы по ключу?

Есть массив, который я получаю из БД (через mysqli_fetch_all), в каждом из них есть ключ (который является id из другой таблицы). Мне нужно наименее трудозатратным способом достать эти массивы. Вот пример массива:

[
    0 => [
           'post_id' => '4'
           'thread_id' => '1'
           'username' => 'user'
           'message' => 'Сообщение'
         ]
    1 => [
           'post_id' => '7'
           'thread_id' => '2'
           'username' => 'user'
           'message' => 'Сообщение'
         ]
    2 => [
           'post_id' => '9'
           'thread_id' => '1'
           'username' => 'user'
           'message' => 'Сообщение'
         ]
]

Из этого него мне нужно получить все ассоциативные массивы, в которых thread_id == '1', т.е. чтобы получился такой массив:

[
    0 => [
           'post_id' => '4'
           'thread_id' => '1'
           'username' => 'user'
           'message' => 'Сообщение'
         ]
    1 => [
           'post_id' => '9'
           'thread_id' => '1'
           'username' => 'user'
           'message' => 'Сообщение'
         ]
]

Знаю, что можно пройтись просто циклом и проверять какое значение thread_id, но я думаю что это будет работать не так быстро, т.к. каждый раз будет проходиться по всем элементам. Смотрел документацию php, но я там того что мне надо не нашел, возможно плохо искал.


Ответы (1 шт):

Автор решения: phpBear

Уж не знаю как у Вас устроена БД. Но, я бы конечно тоже как и комментаторы использовал sql-запрос, чтобы наименее затратным способом получить нужные Вам данные. Но, как говорится, хозяин-барин. Раз у Вас возникло желание сделать это на php, то как говорится получите и распишитесь

$data = [
    0 => [
           'post_id' => '4',
           'thread_id' => '1',
           'username' => 'user',
           'message' => 'Сообщение'
         ],
    1 => [
           'post_id' => '7',
           'thread_id' => '2',
           'username' => 'user',
           'message' => 'Сообщение'
         ],
    2 => [
           'post_id' => '9',
           'thread_id' => '1',
           'username' => 'user',
           'message' => 'Сообщение'
         ]
];

function arraySearchByKeyAndValue($keyValue = [], $searchArray = [] ) {
    $result = [];
    if ( is_array( $keyValue ) && count( $keyValue ) > 0 && is_array( $searchArray ) && count( $searchArray ) > 0) {
        foreach( $keyValue as $searchKey => $searchValue ) {
            foreach( $searchArray as $sArray ) {
                if ( is_array( $sArray ) && count( $sArray ) > 0 ) {
                    if ( in_array( $searchKey, array_keys( $sArray ) ) && $sArray[$searchKey] == $searchValue && !in_array( $sArray, $result ) ) {
                        $result[] = $sArray;
                    }
                }
            }
        }
    }
    return $result;
}


$result = arraySearchByKeyAndValue( [ 'thread_id' => '1' ], $data );
var_dump( $result )

Функция получилась довольно гибкой. Вы можете искать сразу по нескольким условиям (учтите, что условия не "суммируются" а-ля "AND" в sql )

$result = arraySearchByKeyAndValue( [ 'thread_id' => '1', 'post_id' => '4' ], $data );
→ Ссылка