Сопоставление значений из объекта array

#php #arrays

#php #массивы

Вопрос:

У меня есть страница PHP с идентификатором проекта. Я запускаю запрос с использованием класса и возвращаю набор данных атрибутов некоторых элементов, связанных с этим идентификатором проекта. Данные возвращаются в следующем объектном формате:

 Array
(

[0] => stdClass Object
    (
        [id] => 1
        [projectID] => 469
        [itemID] => item_1
        [weight] => 20
        [length] => medium
    )

[1] => stdClass Object
    (
        [id] => 2
        [projectID] => 469
        [itemID] => item_2
        [weight] => 50
        [length] => medium
    )

[2] => stdClass Object
    (
        [id] => 3
        [projectID] => 469
        [itemID] => item_4
        [weight] => 75
        [length] => long
    )

) 
  

Итак, теперь мне нужно добавить эти атрибуты к элементу page. Каждый элемент страницы имеет уникальный идентификатор, который соответствует ItemId из возвращаемых данных, но мне трудно понять, как сопоставить их.

 <div id="item_2">'.( $myarray[1]['itemID'] == 'item_2' ?  
    $myarray[1]['weight'] : '0' ).' lb</div>

<div id="item_2">'.( $myarray[1]['itemID'] == 'item_2' ?  
    $myarray[1]['length'] : '0' ).' ft</div>


<div id="item_3">'.( $myarray[2]['itemID'] == 'item_3' ?  
    $myarray[2]['weight'] : '0' ).' lb</div>

<div id="item_3">'.( $myarray[2]['itemID'] == 'item_3' ?  
    $myarray[2]['length'] : '0' ).' ft</div>
  

Комментарии:

1. Если itemId ключи уникальны, то создайте цикл (или используйте array_walk), который будет проходить через возвращаемый массив объектов и создаст массив, проиндексированный itemId . Затем в разделе index $arr['item_3'] у вас будут данные из исходного массива, так что вы можете, например, выполнить echo <div id="item_3">'.$arr['item_3']->wiegth.'</div> . Не знаю, это ли вы имеете в виду. Я думаю, вам следует переформулировать вопрос, чтобы он был более понятным.

2. У меня может быть несколько элементов на странице, и я думаю, что это повлияет на мое время загрузки, если я буду перебирать этот массив, чтобы сопоставить набор атрибутов для каждого элемента. Я хотел бы просто сделать $ myarray [‘item_4’][‘weight’], но я не могу, пока не добавлю идентификатор верхнего узла, т. е. $ myarray [2] [‘item_4’] [‘weight’]. Есть ли способ сломать этот огромный объект?

3. Вы можете просто сделать $myarray['item_4']->weight , если вы выполните итерацию по всему массиву ОДИН раз и создадите другой массив из исходного.

4. Я не уверен, что понимаю, как мне создать другой массив. Для каждого элемента должен быть массив?

5. да, создайте другой массив или просто замените цифровые ключи по умолчанию на itemId единицы.

Ответ №1:

Предполагая, что item_id ключи уникальны, этот код создает массив, проиндексированный item_id , из исходного массива.

 $newArr = array();
//create reindexed array based on data from original array ($orgArr)
array_walk($orgArr, function($v) use (amp; $newArr) { $newArr[$v->item_id] = $v; } );
  

Затем вы можете получить доступ к отдельным свойствам следующим образом.

 echo $newArr['item_1']->weight;
echo $newArr['item_2']->length;