Для скрипта интернет-магазина я пытаюсь создать фильтр для моего двумерного массива. Я использовал несколько руководств и других ответов здесь, в Stackoverflow или w3Schools, но продолжаю сталкиваться с той же проблемой;

В только что созданном массиве есть пустые пробелы, в которых фильтр отбирает данные, а не создает массив от 0 до 100, полный релевантной информации.

Так как я все еще новичок во всем этом многомерном массиве, я надеялся, что кто-то здесь может указать мне правильное направление и сказать мне, что я делаю неправильно.

Массив полностью заполняется данными из моей базы данных

                if ($result->num_rows > 0) {
                    while($row = $result->fetch_assoc()) {

                        $product[] = [
                            "ID" => $row["ID"],
                            "Name" => $row["Productname"],
                            "Price" => $row["Pricetag"],
                            "Supply" => $row["Productsupply"],
                            "Type" => $row["Producttype"],
                            "Tags" => $row["Tags"],
                            "Materials" => $row["Materials"],
                            "Date" => $row["Releasedate"],
                            "Description" => $row["Description"],
                            "isDigital" => $row["isDigital"],
                            "MainPhoto" => $row["MainPhoto"],
                            "Photo01" => $row["Productpic01"],
                            "Photo02" => $row["Productpic02"],
                            "Photo03" => $row["Productpic03"]
                        ];
                    }
                } else {
                    echo "0 results found. Please check database connection.";
                }

Скрипт для фильтрации этих данных и создания нового массива на основе совпадений в ключе:

    $Filterarray = array('Pluimstaart'); //Might filter on more keywords in future usage.
    $newArr = array();
    foreach ($product as $key => $value) {
        foreach ($value as $finalVal) {
            if(in_array($finalVal, $Filterarray)){ // check if available in filter array
                $newArr[$key]["ID"] = $value["ID"];
                $newArr[$key]["Name"] = $value["Name"];
                $newArr[$key]["Price"] = $value["Price"];
                $newArr[$key]["Supply"] = $value["Supply"];
                $newArr[$key]["Type"] = $value["Type"];
                //$newArr[$key][] = $finalVal;
            }       
        }   
    }

Вывод на сайт:

Array
(
    [1] => Array
        (
            [ID] => 1
            [Name] => Pluisje de Pluimstaart
            [Price] => 75
            [Supply] => 0
            [Type] => Pluimstaart
        )
    [5] => Array
        (
            [ID] => 69
            [Name] => Blizzard de Pluimstaart
            [Price] => 75
            [Supply] => 1
            [Type] => Pluimstaart
        )
)

Проблема здесь в том, что мы пропустили от 1 до 5, я хочу, чтобы новый массив просто сказал

 Array
    (
        [0] => Array
            (
                [ID] => 1
                [Name] => Pluisje de Pluimstaart
                [Price] => 75
                [Supply] => 0
                [Type] => Pluimstaart
            )
        [1] => Array
            (
                [ID] => 69
                [Name] => Blizzard de Pluimstaart
                [Price] => 75
                [Supply] => 1
                [Type] => Pluimstaart
            )
    )
0
Daniel de Ridder 21 Авг 2018 в 13:23

3 ответа

Лучший ответ

Пожалуйста, используйте функцию array_values следующим образом:

  $newArr = array(1 => array("one", "two", "three"), 5 => array("horse", "cat", "monkey"));

print_r($newArr); // test print

$newArr = array_values($newArr);

print_r($newArr); // test print
0
Asisito 21 Авг 2018 в 10:40

Попробуйте функцию массива, array_values ()

См. http://php.net/manual/en/function.array- values.php

0
Suriya Prakash.M 21 Авг 2018 в 10:27

Вы устанавливаете ключ для каждого продукта, отфильтрованного в вашем $ newArr, это означает, что вы получите новый массив с исходными индексами.

Чтобы избежать этого, просто удалите индекс $ key из инициализации $ newArr [].

$Filterarray = array('Pluimstaart'); //Might filter on more keywords in future usage.
    $newArr = array();
    foreach ($product as $key => $value) {
        foreach ($value as $finalVal) {
            if(in_array($finalVal, $Filterarray)){ // check if available in filter array
                $newArr[]["ID"] = $value["ID"];
                $newArr[]["Name"] = $value["Name"];
                $newArr[]["Price"] = $value["Price"];
                $newArr[]["Supply"] = $value["Supply"];
                $newArr[]["Type"] = $value["Type"];
                //$newArr[][] = $finalVal;
            }       
        }   
    }

Или даже лучше

if(in_array($finalVal, $Filterarray)){
    array_push($newArr, array(
        "ID" => $value["ID"],
        "Name" => $value["Name"],
        "Price" => $value["Price"],
        "Supply" => $value["Supply"],
        "Type" => $value["Type"]
    );
}

Если вам нужно отслеживать ключ $, просто сохраните его в дополнительном параметре $ newArr.

0
Alberto 21 Авг 2018 в 10:42
51946580