#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;