PHP: изменение ассоциативного массива на основе значения ключа - PullRequest
0 голосов
/ 01 марта 2020

У меня есть такой массив

Array
(
    [id] => 3
    [type] => default
    [place] => 1
)
Array
(
    [id] => 3
    [type] => default
    [place] => 2
)
Array
(
    [id] => 3
    [type] => default
    [place] => 3
)

Этот массив создан из этого php

for($count=1;$count <= 3;$count++){
$places_array = array(
    "id" => "3",
    "type" => "default",
    "place" => $count,
);
}

Теперь я хочу изменить результат этого массива, если место найдено по данным php mysql. Например, у меня есть этот массив.

Array
(
    [id] => 7
    [type] => 1
    [place] => 2
    [description] => This is item place 2
    [image] => this_is_the_image.png
)

Как вы можете видеть, что второй массив находится в «месте 2». Теперь я хочу, чтобы результат был таким

Array
(
    [id] => 3
    [type] => default
    [place] => 1
)
Array
(
    [id] => 7
    [type] => 1
    [place] => 2
    [description] => This is item place 2
    [image] => this_is_the_image.png
)
Array
(
    [id] => 3
    [type] => default
    [place] => 3
)

Как этого добиться? Я уже сделал с функцией array_search, но не повезло. кто-нибудь, пожалуйста, помогите мне

======================= РЕДАКТИРОВАТЬ ПОЛНЫЙ КОД ============== ================== Вот код, я показываю данные из базы данных и вызываю их, пока l oop function

for($count=1;$count <= $max_places;$count++){
    $array[] = array(
        "id" => $res['id'],
        "type" => "default",
        "place" => $count
    );
    while($arr = $stmts->fetch()){
        $key = array_search($arr['place'], array_column($array, 'place'));
        if($key && array_key_exists($key, $array)) {
            $array[$key] = [
                "id" => $arr['id'],
                "type" => $arr['type'],
                "place" => $arr['place'],
                "url" => $arr['url'],
                "image" => $arr['image']
            ];
        }
    }
}

========================= ЗАМЕНЕННЫЙ КОД ======================= =======

while($arr = $stmts->fetch()){
        $array[] = [
                "id" => $arr['id'],
                "type" => $arr['type'],
                "place" => $arr['place'],
                "url" => $arr['url'],
                "image" => $arr['image']
        ];
    for($count=1;$count <= $max_places;$count++){
    $key = array_search($arr['place'], array_column($array, 'place'));
    if($key && array_key_exists($key, $array)) {
        $array[] = array(
            "id" => $res['id'],
            "type" => "default",
            "place" => $count
        );
        }
    }  
}

Ответы [ 4 ]

0 голосов
/ 01 марта 2020

Нашел ответ, спасибо за помощь.

Вот трюк

Сначала нам нужно определить основной массив следующим образом:

for($count=1;$count <= $max_places;$count++){
        $array[$count] = array(
            "id" => $res['id'],
            "type" => "default",
            "place" => $count
        );
} 

Затем нам нужно чтобы найти, какое место недоступно и показать совпадения.

while($arr = $stmts->fetch()){
    $key = array_search($arr['place'], array_column($array, 'place'));
    $key+=1;
    if($key && array_key_exists($key, $array)) {
        $array[$arr['place']] = [
            "id" => $arr['id'],
            "type" => $res['type'],
            "place" => $arr['place'],
            "url" => $arr['url'],
            "image" => $arr['image']
        ];
    }
}

Хитрость в

$key+=1;

Поскольку ключ по умолчанию в массиве равен 0. Надеюсь, это может помочь другим

0 голосов
/ 01 марта 2020

Попробуйте:

for($count=1;$count <= 3;$count++){
    if(array_search($count,array_column("place",$array_from_db)) continue;
    $places_array = array(
        "id" => "3",
        "type" => "default",
        "place" => $count,
        );
}

Это будет пропущено:

Array
(
    [id] => 3
    [type] => default
    [place] => 2
)

=========== РЕДАКТИРОВАТЬ =========== ==

while($arr = $stmts->fetch())
{
    $array[$arr['place']] = [
        "id" => $arr['id'],
        "type" => $arr['type'],
        "place" => $arr['place'],
        "url" => $arr['url'],
        "image" => $arr['image']
    ];
}
for($count=1;$count <= $max_places;$count++){
    if(!isset($array[$count])){
        $array[$count] = array(
            "id" => $res['id'],
            "type" => "default",
            "place" => $count
        );
    }
}  
ksort($array);
0 голосов
/ 01 марта 2020

Используйте array_column() с array_search(), чтобы получить массив ключ , который необходимо изменить. См. Следующий фрагмент кода:

<?php

// Here is trick; get the key of the array using array_column
$key = array_search('2', array_column($array, 'place'));

// If any key found modify the array
if ($key && array_key_exists($key, $array)) {
    $array[$key] = [
        'id' => 7,
        'type' => 1,
        'place' => 2,
        'description' => 'This is item place 2',
        'image' => 'this_is_the_image.png',
    ];
}

print_r($array);

См. демо

0 голосов
/ 01 марта 2020

Вы можете использовать встроенную функцию array_multisort ().

Пример, скопированный из php. net Хороший способ выполнить сортировку ключа в многомерном массиве без необходимости знать, что ключи, которые у вас есть в массиве первыми:

<?php
    $people = array(
        array("name"=>"Bob","age"=>8,"colour"=>"red"),
        array("name"=>"Greg","age"=>12,"colour"=>"blue"),
        array("name"=>"Andy","age"=>5,"colour"=>"purple")
    );

var_dump($people);

$sortArray = array();

foreach($people as $person){
    foreach($person as $key=>$value){
        if(!isset($sortArray[$key])){
            $sortArray[$key] = array();
        }
        $sortArray[$key][] = $value;
    }
}

$orderby = "name"; //change this to whatever key you want from the array

array_multisort($sortArray[$orderby],SORT_DESC,$people);

var_dump($people);
?>

Нет проверки того, существуют ли ваши ключи массива, или данные массива, по которым вы ищете, действительно есть, но их достаточно просто добавить.

Проверьте https://www.php.net/manual/de/function.ksort.php (пользователь добавляет) и https://www.php.net/manual/de/function.array-multisort.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...