ck/file_marc_reference

File_MARC 的 MARCspec 适配器

v1.2.0 2017-12-01 09:16 UTC

README

Build Status Coverage Status

File_MARC_Reference 是 PHP 中著名的 MARC 解析器 File_MARC 的扩展。使用 File_MARC_Reference,您可以使用 MARCspec 作为统一的方式访问 MARC 数据。此外,它极大地简化了 File_MARC。

安装

可以使用 Composer 进行安装。只需运行

composer require ck/file_marc_reference

使用方法

首先 require autoload.php

<?php
require("vendor/autoload.php");

从文件或字符串中读取 MARC 21 数据保持不变(参见 File_MARC - 读取 MARC 数据

// Retrieve a set of MARC records from a file
$records = new File_MARC('data.mrc');

// Iterate through the retrieved records
while ($record = $records->next())
{
 //...
}

现在,如果您想使用 MARCspec 引用数据,您必须初始化一个新的 File_MARC_Reference

// Retrieve a set of MARC records from a file
$records = new File_MARC('data.mrc');

// Iterate through the retrieved records
while ($record = $records->next())
{
    $reference = new File_MARC_Reference('245$a',$record);
}

数据引用后,有三个公共属性可用

$reference = new File_MARC_Reference('245$a',$record);

// attribute data
$subfield = $reference->data[0];
print get_class($subfield);               // File_MARC_Subfield
print $subfield->getCode();               // a

// attribute content
print $reference->content[0];             // prints content of subfield a of field 245

// attribute cache
$field = $reference->cache['245'][0];
print get_class($field);                  // File_MARC_Data_Field
$subfield = $reference->cache['245$a'];
print get_class($subfield);               // File_MARC_Subfield

让我们看看如何使用 File_MARC 检查依赖关系,如果您有一个像这样的任务:当字段 007 的索引位置 "0" 的字符为 "m"、"s" 或 "v" 时,引用字段 306 的子字段 "a" 的内容。

而不是编写 ...

$fields_007 = $record->getFields('007');

$field_306 = $record->getField('306');

$subfields_a = false;

foreach($fields_007 as $field_007)
{
    $firstChar = substr($field_007->getData(),0,1);
    
    if(strpbrk($firstChar,"msv"))
    {
        $subfields_a = $field_306->getSubfields('a');
        break;
    }
}

if($subfields_a)
{
    foreach($subfields_a as $subfield_a)
    {
        echo $subfield_a->getData()."\n";
    }
}

... 使用 File_MARC_Reference 完成相同的任务

    $reference = new File_MARC_Reference('306$a{007/0=\m|007/0=\s|007/0=\v}',$record);
    
    foreach($reference->content as $subfield_a)
    {
        echo $subfield_a."\n";
    }
    
    // interested in field 007? No problem!
    print get_class($reference->cache['007'][0]);       // File_MARC_Control_Field
    print $reference->cache['007/0'][0];                // prints the first char of first 007 field
    print $reference->cache['007/0'][1];                // prints the first char of second 007 field