Use array_search in a multidimensional array php

2

In a list of books within a% multidimensional%, every array has a different column category , I would like to search this sub_array for a category > for example:

Array  "livros"
    (
        [Livro 1] => Array
            (
                [titulo] => Bleach
                [resumo] => xxx
                [categoria] => Ação, Comédia...
            )

        [Livro 2] => Array
            (
                [titulo] => Titulo livro 2
                [resumo] => xxx
                [categoria] => Ação, Psicológico, Romance ...
            )

        [livro 3] => Array
            (
                [titulo] => Titulo do livro 3
                [resumo] => xxx
                [categoria] => Romance, Vampiros ...
            )
)

I would like to search for example which books fit the "Romance" category, I did some research and found what might be the solution, but for some reason it is not working, that would be this function:

$romances = array_keys(array_column($livros, 'categoria'), 'Romance');

The above function does not bring any value, just an empty% void, what am I doing wrong?

    
asked by anonymous 19.11.2016 / 00:45

2 answers

1

Combine array_keys with array_filter , and in comparison with strpos that searches for the first occurrence of a text ( string ).

Note: If you do not want to change the case, change the strpos to stripos that by definition: find first occurrence of a case-insensitive string ( PHP stripos site ).

Based on the response from SOEn

$livros = array(
    'Livro 1' => array (
        'titulo' => 'Bleach',
        'resumo' => 'xxx',
        'categoria' => 'Ação, Comédia...'
    ),
    'Livro 2' => array (
        'titulo' => 'Titulo livro 2',
        'resumo' => 'xxx',
        'categoria' => 'Ação, Psicológico, Romance ...'
    ),
    'Livro 3' => array (
        'titulo' => 'Titulo do livro 3',
        'resumo' => 'xxx',
        'categoria' => 'Romance'
    )
);

$search = 'Romance';
$romances = array_keys(
    array_filter(
        $livros,
        function ($value) use ($search) {
            return (strpos($value['categoria'], $search) !== false);
        }
    )
);

Example Online

References:

19.11.2016 / 01:02
4

This happens because in the case of the question there is no book whose category is ONLY "Romance", otherwise data would return. We need to check if the word "Romance" exists in the $livros[x]['categoria'] string, do the following:

$livros = array(
    'livro 1' => array(
        'titulo' => 'Bleach',
        'resumo' => 'xxx',
        'categoria' => 'Ação, Comédia'
    ),
    'livro 2' => array(
        'titulo' => 'Titulo livro 2',
        'resumo' => 'xxx',
        'categoria' => 'Ação, Psicológico, Romance...'
    ),
    'livro 3' => array(
        'titulo' => 'Titulo livro 3',
        'resumo' => 'xxx',
        'categoria' => 'romance, Vampiros ...'
    )
);
$romances = array();
foreach($livros as $livro => $data) {
    if(stripos($data['categoria'], 'Romance') !== false) {
        $romances[] = $livro; 
    }
}
print_r($romances);

Output of $romances (the array with names of books that are also novels):

  

Array ([0] => Book 2 [ 1 ] => Book 3)

STATEMENT

    
19.11.2016 / 00:59