PHP: объединить два multimensioanl массива в один - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь создать многомерный массив ($list), который должен выглядеть следующим образом:

[
  {"uri": "http://www.example.com/1", "traverseCount": "1"},
  {"uri": "http://www.example.com/2", "traverseCount": "1"},
  {"uri": "http://www.example.com/3", "traverseCount": "1"}
]

Но я не знаю, как лучше всего добиться этого из следующих данных.Два источника данных взяты из двух If-Else и , которые пытаются создать многомерный массив для каждого случая.Но, в конце концов, я хотел бы создать многомерный массив, который объединяет два многомерных массива с непрерывными упорядоченными ключами.(Таким образом, из приведенного выше примера http://www.example.com/1 и http://www.example.com/2 получаются из результата 1-го Else-If, а http://www.example.com/3 - из второго Else-If).Хитрость в том, что внутри Else-If есть foreach.

// Create an empty multidimentional array to accommodate 2 datasets (2 If-Else cases) below:
$traverseCount = 1;
$list = array(
  array(),
  array()
);
//This is the first data source. Say, it returns 2 URIs when doing the foreach loop:
$match = $graph->resourcesMatching('skos:exactMatch');
if (isset($match) == true && count($match) > 0){
  $graphuris = $match[0]->all('skos:exactMatch');
  echo '<b>skos:exactMatch Links: </b><br>';
  foreach ($graphuris as $uris) {
    $counter = 0;
    $list[$counter][0] = $uris->__toString();
    $list[$counter][1] = $traverseCount;
    $counter++;
    echo '<a href="'.$uris.'" target="_blank">'.$uris.'</a><br>';
  }
}
else {
  echo '<p>No skos:exactMatch found</p>';
}
//This is the second data source, whose multidimensional array should be added to the end of the previous multidimensional array 
$match2 = $graph->resourcesMatching('rdfs:seeAlso');
if (isset($match2) == true && count($match2) > 0){
  $graphuris2 = $match2[0]->all('rdfs:seeAlso');
  echo '<b>rdfs:seeAlso Links: </b><br>';
  foreach ($graphuris2 as $uris2) {
    $counter = 0;
    $list[$counter][0] = $uris2->__toString();
    $list[$counter][1] = $traverseCount;
    $counter++;
    echo '<a href="'.$uris2.'" target="_blank">'.$uris2.'</a><br>';
  }
}
else{
  echo '<p>No rdfs:seeAlso found</p><br>';
}
// $traverseCount is always 1 until here, but it needs to add 1 for the next script to run.
$traverseCount++;

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018

Это не должно быть так сложно.Добавление в массив может быть сделано без необходимости для $counter, как это.

// Create an empty multidimentional array to accommodate 2 datasets (2 If-Else cases) below:
$traverseCount = 1;

$list = array();
//This is the first data source. Say, it returns 2 URIs when doing the foreach loop:
$match = $graph->resourcesMatching('skos:exactMatch');
if (isset($match) == true && count($match) > 0){
  $graphuris = $match[0]->all('skos:exactMatch');
  echo '<b>skos:exactMatch Links: </b><br>';
  foreach ($graphuris as $uris) {

    $list[] = array('uri'           => $uris->__toString(), 
                    'traversecount' => $traverseCount
                    );

    echo '<a href="'.$uris.'" target="_blank">'.$uris.'</a><br>';
  }
}
else {
  echo '<p>No skos:exactMatch found</p>';
}
//This is the second data source, whose multidimensional array should be added to the end of the previous multidimensional array 
$match2 = $graph->resourcesMatching('rdfs:seeAlso');
if (isset($match2) == true && count($match2) > 0){
  $graphuris2 = $match2[0]->all('rdfs:seeAlso');
  echo '<b>rdfs:seeAlso Links: </b><br>';
  foreach ($graphuris2 as $uris2) {
    $list[] = array('uri'           => $uris2->__toString(), 
                    'traversecount' => $traverseCount
                    );

    echo '<a href="'.$uris2.'" target="_blank">'.$uris2.'</a><br>';
  }
}
else{
  echo '<p>No rdfs:seeAlso found</p><br>';
}
// $traverseCount is always 1 until here, but it needs to add 1 for the next script to run.
$traverseCount++;

Я немного запутался насчет $traverseCount, так как он, кажется, не меняется в вашем коде дооба цикла завершены.

0 голосов
/ 27 сентября 2018

Вы всегда сбрасываете это $counter в 0 в каждой итерации.Вместо этого просто добавьте новый элемент в массив:

$list = [];

if () {
    foreach () {
        $list[] = [
            $uris->__toString(),
            $traverseCount
        ];
    }
}

Здесь я не использую счетчик, просто добавляю новый элемент в массив, используя $list[], и индексы будут автоматически увеличиваться.

$uris->__toString() и $traverseCount автоматически устанавливают в индексы 0 и 1


Я не вижу, как меняется $traverseCount, поскольку ему присваивается 1 в начале и только в конце он увеличивается.

...