PHP in_array не работает или работает странно - PullRequest
0 голосов
/ 18 апреля 2020

Извините за мой плохой Энгли sh, но у меня есть проблема, которую я не могу решить. У меня есть массивы, которые содержат массивы с ключевыми «тегами» (я буду называть его «тег-массив»). В некоторых тегах-массивах используются одинаковые значения, поэтому я хочу создать один массив, который будет содержать значения из тег-массивов без повторений.

список значений, которые у меня есть в массивах тегов:

=================
php
bootstrap
html
css
=================
php
=================
bootstrap
=================
laravel
=================
php

Пример массива, который содержит массив тегов:

        Array
    (
        [0] => Array
            (
                [id] => 5
                [project_name] => Something 5
                [info_1] => Some test information 1
                [tags] => Array
                    (
                        [0] => php 
                        [1] =>  html 
                        [2] =>  bootstrap 
                        [3] =>  css
                    )
                [img_1] => 1.jpg
            )
         [1] => Array(...)
         [2] => Array(...)
         [3] => Array(...)
         [4] => Array(...)
}

Что я сделал, чтобы создать новый отсортированный массив:

public function sortTags($data){
        $works_number = $this->getCountWorks(); //count arrays
        $new_arr =  array();
        for($i=0; $i < $works_number; $i++){
            foreach ($data[$i]['tags'] as $key => $val) {
                if(!in_array($val, $new_arr)){
                    array_push($new_arr, $val);
                }
            }
        }
        echo "Debug : <br /> <pre>";
        print_r($new_arr);
        echo "<pre>";
    }

Что и ожидалось:

Array
(
    [0] => php 
    [1] =>  html 
    [2] =>  bootstrap 
    [3] =>  css
    [6] => laravel
)

Реальное восстановление (посмотрите, что у меня есть еще один массив, где также есть "php", но функция отсортировала его и не записала):

Array
(
    [0] => php 
    [1] =>  html 
    [2] =>  bootstrap 
    [3] =>  css
    [4] => php
    [5] => bootstrap
    [6] => laravel
)

Так почему же моя функция не делает то, что я хочу (и как это исправить) и почему функция SORTED LAST ELEMENT?

1 Ответ

3 голосов
/ 18 апреля 2020

Ваш код не работает, потому что у вас есть пробелы вокруг некоторых тегов. Вам нужно trim () их, прежде чем помещать их в массив. Если вы хотите, чтобы они были отсортированы, вам нужно вызвать sort() для массива.

public function sortTags($data){
    $works_number = $this->getCountWorks(); //count arrays
    $new_arr =  array();
    for($i=0; $i < $works_number; $i++){
        foreach ($data[$i]['tags'] as $key => $val) {
            $val = trim($val);
            if(!in_array($val, $new_arr)){
                array_push($new_arr, $val);
            }
        }
    }
    sort($new_arr);
    echo "Debug : <br /> <pre>";
    print_r($new_arr);
    echo "<pre>";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...