Использование PHPLinq - Kirby db mimicking
У меня есть массив или массивы. Около 500 праймериз по 6 линий в каждой.
Вот первые 2 примера:
Array
(
[0] => Array
(
[Stock book code] => a-04
[Date] => 1962
[Work Title] => River Barge
[height] => 0
[width] => 0
[materials] => Oil on Board
[Ownership] => Sold
)
[1] => Array
(
[Stock book code] => a-08
[Date] => 1962
[Work Title] => Thames Bridge Fantasy
[height] => 48
[width] => 36
[materials] => Oil on Board
[Ownership] => Available
)
Я хочу добавить выделение этого кода в функцию while для печати метаданных на некоторых изображениях.
Мне нужно запросить этот список, чтобы найти переменную $image
, который будет иметь значения, хранящиеся в [Код книги запасов], например. а-04. Было высказано предположение, что лучшим подходом будет библиотека Linq. например, https://code.google.com/p/phinq
Массив в настоящее время вызывается через фрагмент, например <?php snippet('csvtoarrayvibhu')?>
, так что это может быть предварительно загружено глобально или помещено в оператор if. Мнения о том, что было бы лучше, приветствуются.
<ul class="gallery">
<?php $imagelist= $page->imagelist();
if ($imagelist != ''){
$imagelistitem= explode(", ", $imagelist);
foreach ($imagelistitem as $image): ?>
<li><img src="<?php echo url('assets/artistswork/450/').$image.'.jpg' ?>" />
запрос здесь
<span class="workTitle">Title</span><span class="workDate">Date</span><span class="workMaterial">Material</span><span class="workDimensions">Dimensions</span><span class="workPrice">Price</span></li>
<?php endforeach ;} ?>
</ul>
В настоящее время я работаю с CSV для массива Complier с использованием кода следующим образом. Из проекта на gist hub https://gist.github.com/jaywilliams/385876 и первого ответа от Джо ниже. Это работает чудесно.
Не знаю, имеет ли смысл делать это в одной или двух функциях, поэтому я процитировал лот ниже.
<?PHP
function csv_to_array($filename='', $delimiter=',') {
if (!file_exists($filename))
return 'not exist';
if (!is_readable($filename))
return 'not readable';
$header = NULL;
$data = array();
if (($handle = fopen($filename, 'r')) !== FALSE) {
while (($row = fgetcsv($handle, 200, $delimiter)) !== FALSE) {
if (!$header)
$header = $row;
else
$data[] = array_combine($header, $row);
}
fclose($handle);
}
return $data;
}
function createModels($data)
{
$newRow = array();
if (is_array($data)){
foreach($data as $rowIndex => $row){
if(is_array($row)){
$newRowIndex = $row['Stock book code'];
}
$newData[$newRowIndex] = array_merge($newRow, $row);
}
}
return $newData;
}
echo '<pre>';
$imageinfoarray = csv_to_array('peterliddle/assets/artistswork/imagemeta.csv');
print_r(createModels($imageinfoarray));
echo '</pre>';
?>
1 ответ
Было бы лучше, если бы вы могли переделать ваш массив так, чтобы он выглядел больше так;
Array
(
[a-04] => Array
(
[Stock book code] => a-04
[Date] => 1962
[Work Title] => River Barge
[height] => 0
[width] => 0
[materials] => Oil on Board
[Ownership] => Sold
)
[a-08] => Array
(
[Stock book code] => a-08
[Date] => 1962
[Work Title] => Thames Bridge Fantasy
[height] => 48
[width] => 36
[materials] => Oil on Board
[Ownership] => Available
)
)
Затем вы можете просто вызвать данные как $ AdditionalData[$image]['Work Title'], предполагая, что ваш дополнительный массив данных хранится в $ extraData, а ваше $ image содержит инвентарный номер элемента. По сути, здесь вы создаете массив моделей, где каждая строка массива содержит всю информацию об одном экземпляре данных.
Вы можете сделать свой массив выглядеть так, добавив функцию так
function createModels($data)
{
$newRow = array();
if (is_array($data)){
foreach($data as $rowIndex => $row){
if(is_array($row)){
$newRowIndex = $row['Stock book code'];
}
$newData[$newRowIndex] = array_merge($newRow, $row);
}
}
return $newData;
}
и вызывая его из вашего существующего фрагмента.